r600_shader.c revision 4502b17901ad491e0598ee59a12d372c008ae03b
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/*
272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"),
672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation
772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next
1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software.
1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */
23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h"
24de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h"
25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h"
2633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h"
27de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h"
2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h"
2972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h"
30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h"
31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h"
32de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
51cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
52cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
612b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[];
63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader)
66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	const struct util_format_description *desc;
69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	enum pipe_format resource_format[160];
70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, nresources = 0;
71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc *bc = &shader->bc;
72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_cf *cf;
73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx *vtx;
74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return 0;
77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (cf->inst) {
82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (desc == NULL) {
87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return -EINVAL;
89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				}
90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_bc_build(&shader->bc);
101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx,
1046f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			struct r600_context_state *rpshader,
1056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			const struct tgsi_token *tokens)
106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_screen *rscreen = r600_screen(ctx->screen);
108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
11036efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
11136efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0);
112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rpshader == NULL)
1136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return -ENOMEM;
114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->shader.family = radeon_get_family(rscreen->rw);
115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_from_tgsi(tokens, &rpshader->shader);
116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("translation from TGSI failed !\n");
1186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_build(&rpshader->shader.bc);
121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("building bytecode failed !\n");
1236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
12536efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n");
1266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return 0;
127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1296f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader)
13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
131ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
13272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
134313df4156279f84ebc5b98a7540820b994762650Jerome Glisse	unsigned i, tmp;
13572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1366e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
1372184f3ec3059eaf8a9a2b04c995162543f000862Dave Airlie	state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER);
1386e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	if (state == NULL)
1396e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse		return -ENOMEM;
140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 10; i++) {
141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0;
142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1436c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	/* so far never got proper semantic id from tgsi */
1446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	for (i = 0; i < 32; i++) {
1456c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = i << ((i & 3) * 8);
1466c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i / 4] |= tmp;
147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2);
149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr) |
150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		S_028868_STACK_SIZE(rshader->bc.nstack);
1516e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = state;
1526e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1536e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1546e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->nbo = 2;
1556e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
156ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisse	rpshader->rstate->placement[2] = RADEON_GEM_DOMAIN_GTT;
15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader)
16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
162457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	const struct pipe_rasterizer_state *rasterizer;
163ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
165457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
1675f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	unsigned i, tmp, exports_ps, num_cout;
16872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
169457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	rasterizer = &rctx->rasterizer->state.rasterizer;
1706e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
1712184f3ec3059eaf8a9a2b04c995162543f000862Dave Airlie	state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER);
1726e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	if (state == NULL)
1736e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse		return -ENOMEM;
17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	for (i = 0; i < rshader->ninput; i++) {
1756c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = S_028644_SEMANTIC(i);
17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_SEL_CENTROID(1);
17735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR ||
17835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) {
17935e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
18035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		}
181457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (rasterizer->sprite_coord_enable & (1 << i)) {
182457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			tmp |= S_028644_PT_SPRITE_TEX(1);
183457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp;
18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
1865f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie
1875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	exports_ps = 0;
1885f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	num_cout = 0;
1895f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	for (i = 0; i < rshader->noutput; i++) {
1905f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
1915f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			exports_ps |= 1;
1925f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) {
1935f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			exports_ps |= (1 << (num_cout+1));
1945f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			num_cout++;
1955f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		}
1965f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	}
197bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse	if (!exports_ps) {
198bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse		/* always at least export 1 component per pixel */
199bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse		exports_ps = 2;
200bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse	}
20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) |
20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse							S_0286CC_PERSP_GRADIENT_ENA(1);
20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000;
204a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr) |
205a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		S_028868_STACK_SIZE(rshader->bc.nstack);
2065f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = exports_ps;
2076e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = state;
2086e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
2096e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->nbo = 1;
2106e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
21272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader)
21572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
216ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
217ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
22972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
23172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
23372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
23672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
23772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
23972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
24072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
24572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
24672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader)
24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
25172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
25272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
25372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
26072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
27572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
279c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
280a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
28472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
285a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Src[j].Register.Indirect ||
288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Dimension ||
289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported src (indirect|dimension|absolute)\n");
291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) {
296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported dst (indirect|dimension)\n");
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
30172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
30272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
30472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
30972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
31535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
34235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
34633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
35372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
35472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
35672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
359c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
360457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
36372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
376076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
377076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
378076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
379076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
381076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
382076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
383076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
384076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
409cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
410cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
411cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
417cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
418cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
419cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
420cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
421cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
422cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
423cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
424cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
425cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
426cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
4422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
453457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
454457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
455c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
456c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
457c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
458c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
459c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
460c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
461c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
462c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
463c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
464c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
465c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
466457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
469c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
470c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
472457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
473457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
474457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
475457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
476457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
477457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
483b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
484c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
4855f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
486c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
487c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
49872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
501457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
502457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
503457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
504457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
505457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
506457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
507457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
508457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
509457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
510457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
511457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
512457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
513457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
514457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
515457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
517457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
518457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
519457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
520457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
522c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
523481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
524481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
525481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
526481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
527481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
528481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
529481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
530481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
531481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
532481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
533608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
534481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
535481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
536481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
537481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
538457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
539457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
540457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
541457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
542457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
543b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
544b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
545c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
546c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
547c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
548457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
549457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
550c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
554cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
558cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
578cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	int index;
5797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
583cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
584cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[0] = ctx->literals[index * 4 + 0];
585cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[1] = ctx->literals[index * 4 + 1];
586cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[2] = ctx->literals[index * 4 + 2];
587cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[3] = ctx->literals[index * 4 + 3];
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5891bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5997a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6007a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
6057a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
6067a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
6077a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
6217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
6287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
6317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
6327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
6367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
6437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) {
6447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
6457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
6467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
6477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].sel = r600_src[0].sel;
6487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.sel = ctx->temp_reg + j;
6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
6517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
6527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
6537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
6547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
6557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
6567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
6577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
6587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			r600_src[0].sel = ctx->temp_reg + j;
6597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
6607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
6637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
665d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
671d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	int lasti = 0;
672d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
673d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
674d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
675d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
676d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
677d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
6807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
6817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
682d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
683d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
684d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
685d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
687d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
688d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
689d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
690d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
691d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
692d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
6947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
6957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
697d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
698d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
699d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
700d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
701d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
702d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
7097a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
7107a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
7117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
715d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
725d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
726d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
727d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
728d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
730d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
731d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
732d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
73588f5976484842671ecb2cefcfa91838a43032359Dave Airlie/*
73688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
73788f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
73888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
73988f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
74088f5976484842671ecb2cefcfa91838a43032359Dave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
74188f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
74288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
74388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct r600_bc_alu_src r600_src[3];
74488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct r600_bc_alu alu;
74588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	int i, r;
74688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
74788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
74888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
74988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
75088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
75188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
75288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
75388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
75488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
75588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
75688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
75788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
75888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
75988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
76088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
76188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
76288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
76388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
76488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
76588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
766921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
76788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
768921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
76988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
77088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
77188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
77288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
77388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
77488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
77588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
77688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
77788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
77888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
77988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT;
78088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
78288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
78388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
78488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
78688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
78788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
78888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
78988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
79088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
79188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
79288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (ctx->bc->chiprev == 0) {
79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
79888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
79988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
80288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
80488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
80588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
80888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
80988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
81088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
811921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
81288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
813921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
81488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
81588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
81688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
81788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
81888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
81988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
82088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
82188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
82288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
82388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
82488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
82588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
82688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
82788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
82888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
82988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
83088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
83188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
83288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
83388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
83488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
83588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
83688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
83788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
83888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
83988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.src[0].sel = ctx->temp_reg;
84088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
84188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.dst.chan = i;
84288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
84388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
84488f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
84588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
84688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (i == 3)
84788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
84888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
84988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
85088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
85188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
85288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
85388f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
85488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
855094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
856094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
857094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
858094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
859094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
860094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
861094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
862094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
863094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
8644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
865094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
8664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
867921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
8684502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
8694502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
8704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
8714502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
8724502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
8734502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
8744502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
8754502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
8764502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
8774502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
878094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
879094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
880094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
881094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
882094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
883094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
884094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
8854502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
8864502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	if (r)
8874502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		return r;
8884502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
8894502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
8904502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
8914502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
892094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
893094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
894094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
8950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
8960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
8970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
8990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
9000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
9027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
904921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
9077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
9107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX;
9177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
920921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 0);
9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
9267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.z = NOP - fill Z slot */
9317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
9337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.chan = 2;
9347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
9397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
941921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
9427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
9437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
9447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
9477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
9487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
9530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
9546a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
9556a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
9566a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
9570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
9580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED;
9607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
9610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
9640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
9650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9726a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
9736a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
9740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
9760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT;
9787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
9790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
9817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
9820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
9830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
9847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]);
9850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
9880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
9890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
9900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
9910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
9920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
9980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
10000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
10010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
10020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
10030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
10040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
10050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
10060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
10070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
10080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
10090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
10100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
10110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
10120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
10135cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
10145cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
10155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10165cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
10175cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
10185cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
10195cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
10205cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
10215cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
10225cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
10235cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
10247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
10255cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
10265cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
10277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
10285cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
10295cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10305cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
10315cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
10325cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
10335cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
10345cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
10355cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
10365cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
10375cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
10385cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
10395cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
10405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
1041a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
10427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
10437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1045a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
10467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
10477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
10487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
10497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
10507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
10517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
10527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
10547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
10557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
10567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
10577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
10587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
10597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
10607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
10617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
10627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
10637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
10647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1065a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1066a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1067a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1068a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1069a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1070a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1071a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1072a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1073a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1074a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1075a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1076a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1077a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1078a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1079a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1080a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1081a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1082a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1083a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1084a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1085a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1086a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1087a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1088a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1089a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1090a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1091a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1092a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1093a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1094a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1095a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1096a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1097a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE;
1098a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1099a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1100a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1101a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1102a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1103a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1104a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1105a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1106a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1107a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1108e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1109e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1110e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1111a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1112a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1113a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE;
1114a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1115a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1116a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1117a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1118a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1119a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1120a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1121a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1122a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1123a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1124a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1125e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1126e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1127e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1128a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1129a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1130a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
1131a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1132a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1133a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1134a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1135a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1136a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1137a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1138e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1139e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1140e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1141a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1142a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1143a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
11440d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
11450d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
11460d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11470d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
11480d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1149921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
11500d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
11520d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
11530d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
11540d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11550d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
11560d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
11570d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
11580d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT;
11590d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1160cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
11610d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1162cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
11630d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11640d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
11650d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
11660d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1167921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
11680d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11690d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
11700d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
11710d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
11720d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
11730d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
11740d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11750d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11760d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
1177cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
1178cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	if (r)
1179cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		return r;
11800d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11810d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
11820d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
11830d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
11840d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT;
11850d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
11860d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11870d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11880d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11890d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11900d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1191cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
11920d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
11930d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1194921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
11950d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
11960d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1198cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
11990d48925a56ad4fb253386110b545abda82a25464Dave Airlie
12000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
12010d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
12020d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
12030d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
12040d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
12050d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
12060d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
12070d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
12080d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1209cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1210cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1211cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1212cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1213cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
12149961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
12159961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
12169961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1217cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1218cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1219cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1220cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
12216c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1222cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1223cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1224cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1225cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1226cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1227cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1228cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1229cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1230cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1231cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1232cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1233cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1234cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1235cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1236cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1237cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1238cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1239cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
12487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
12567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1260cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1269cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1270cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1271cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1272cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1273cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1274cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1276cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1277cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1278cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
12807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1284cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1285cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
12877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1288cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1289cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1290cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1291cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1292cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1293cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1294cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1295cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1296921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1297cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1298cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1299cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1300cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1301cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1302921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1303cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1304cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1305cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1306e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1307e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1308e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1309e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1310e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1311e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1312e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1313cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1314cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1323cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
132633241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
132733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
132833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
132933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1330641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1331641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1332b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1333641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1334641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1335641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1336b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1337b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1338b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1339b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
1340b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].sel = src_gpr;
1341b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1342b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1343b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1344b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1345b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1346b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1347b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1348b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1349b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie
1350b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1351b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1352b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1353b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1354b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1355b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].sel = src_gpr;
1356b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1357b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1358b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1359b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1360b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1361b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1362b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1363b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1364b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1365b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1366921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1367b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1368b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1369b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1370b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1371b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1372b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1373b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1374b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1375b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1376b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	} else if (inst->Src[0].Register.File != TGSI_FILE_TEMPORARY) {
1377b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1378b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1379b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1380b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1381b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = i;
1382b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1383b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1384b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1385b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1386b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1387b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1388b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1389b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1390b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1391b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1392b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
139333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
139433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
139533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.inst = ctx->inst_info->r600_opcode;
139633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
139733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
1398641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
13996c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
140033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
140133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
140233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
140333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
140433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
140533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
140633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
140733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
14089a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
140901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
141001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
141101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
14127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
141301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
141401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
141533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	return r600_bc_add_tex(ctx->bc, &tex);
141633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
141733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1418b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1419b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1420b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1422b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1423b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1424b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
14267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
14277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
14287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1431b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1432b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD;
1433921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1434b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
14357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
14367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1437b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1438b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1439b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1440b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1441b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1442b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1443b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1444b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1445b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1446b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1447b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1448b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1449b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1450b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1451b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1452b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1453b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1454b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1455b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1456b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1457b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
14587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
14597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1460b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1461b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1462b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1463b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1464b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1465b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1466b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1467b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1468b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1469b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1470b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1471b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1472b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1473b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1474b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1475b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1476b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1477b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
1478b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
14797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
14807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
14817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
14827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1483b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1484b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1485b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1486b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1487b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1488b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1489b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1490b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1491b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1492b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1493b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1494b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1495b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1496b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
149787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
149887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
149987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
150087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
150187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
150287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
150387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
150487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
150587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
150687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
150787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
150887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
150987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
151087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
151187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
151287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
151387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
151487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE;
151587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
151687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
151787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
151887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
151987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
152087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
152187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
152287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
152387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
152487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
152587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
152687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
152787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
152887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
152987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
153087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
153187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
153287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
153387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
153487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
153587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
153687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
153787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
153887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
153987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	}
154087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
154187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
154287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
154387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
154487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
15450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
15460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
15470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
15490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
15500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
15510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
15520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
15540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
15550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
15570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
15580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
15590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
15610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
15630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
15650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
15680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
15710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
15740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
15770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
15780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
15810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
15840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
15870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
15900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
15930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
15940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
15970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
15980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
15990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
16000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
16010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
16020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
16040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
16050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
16060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
16070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
16080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
16090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
16100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
16110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
16120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
16130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
16140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
16150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
16160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
16170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
16180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
16190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
16200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
16210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
16220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
16230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
16240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
16250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
16260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
16270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
16280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
16290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
16300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
16310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
16320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
16330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
16340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
16350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
16360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
16370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
16380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
16390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
16400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
16410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
16420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
16430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
16440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
16450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
16460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
16470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
16480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
16490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
16500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
16520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
16530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
16540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
16550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
16560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
16570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
16580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
16590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
16610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
16620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
16630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
16640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
16650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
16660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
16670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
166836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
166936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
167036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
167136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu_src r600_src[3];
167236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
167309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
167436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
167536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
167636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
167736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
167836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
167936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
168036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
168136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
168236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
168336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
168436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
168536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
168636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
168736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
168836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
168936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
169036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
169136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
169236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
169336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
169436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
169536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
169636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
169736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
169836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
169936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
170036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
170136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
170236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
170336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
170436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
170536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
170636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
170736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
170836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
170936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
171036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
171136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT;
171236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
171336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
171436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
171536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
171636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
171736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
171836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
171936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
172036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
172136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
172236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
172336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
172436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
172536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
172636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
172736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
172836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
172936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
173036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
173136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
173236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
173336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
173436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
173536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
173636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
173736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
173836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
173936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
174036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
174136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
174236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
174336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
174436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
174536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
174636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
174736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
174836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
174936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
175036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
175136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
175236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
175336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
175436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
175536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
175636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
175736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
175836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
175936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
176036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
176136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
176236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
176336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
176436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
176536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
176636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
176736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
176836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
176936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
177036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
177187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
1772a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
1773a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1774a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
177509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
1776a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
1777a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1778a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
1780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
1781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
1783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
1784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
1785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
1788a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
1789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1790a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
1791a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
1792a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1793a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
1794a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1795a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE);
1796a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
1797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
1798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1799a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
1802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_POP);
1804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = pops;
1805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
180809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
1809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
181009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
181109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
181209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
181309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
181409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
181509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
181609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
181709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
181809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
181909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
182009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
182109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
182209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
182309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
1824a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
182509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
182609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
182709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
182809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
182909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
183009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
183109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
183209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
183309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
183409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
183509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
183609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
183709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
183809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
183909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
184009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
184109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
184209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
184309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
184409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
184509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
184609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
184709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
184809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
184909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
185009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
185109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
185209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
185309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
185409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
185509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
185609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
185709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
185809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
185909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
186009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
186109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
186209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
186309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
186409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
186509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
186609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
186709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
186809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
186909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
187009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
187109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
187209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
1873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
187409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
187509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
1876a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
187709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
187809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
187909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
188009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
188109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
188209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
188309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
188409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
188509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
188609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
188709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
188809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
188909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
189009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
189109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
189209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
189309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
189409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
189509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
189609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
189709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
189809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
189909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
190009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
190109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
190209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
190309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
1904a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
190509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
190609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
190709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
190809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
1909a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
191009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
191109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
191209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
191309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
191409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
191509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
191609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
191709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
191809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
191909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
192009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
192109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
192209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
192309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
192409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
192509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
192609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
192709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
192809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
192909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
193009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
193109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
193209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
193309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
193409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
193509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
193609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
193709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
193809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
193909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
194009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
194109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
194209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
194309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
194409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_logic_pred(ctx, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE);
194509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
194609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
194709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
194809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
194909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
195009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
1951a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1952a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1953a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1954a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
1955a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1956a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_ELSE);
1957a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
1958a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
195909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
1960a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
1961a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1962a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1963a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1964a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
1965a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1966a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
1967a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
1968a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
1969a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
1970a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
1971a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1972a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
1973a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
1974a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
1975a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
197609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
1977a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
197809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
197909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
198009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
198109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
198209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
198309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
198409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
198509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
198609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL);
198709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
198809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
1989a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
199009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
199109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
199209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
199309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
199409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
199509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
199609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
199709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
199809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
199909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END);
200009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
200109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
200209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
200309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
200409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
200509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
200609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
200709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
200809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
200909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
201009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
201109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
201209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
201309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
201409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
201509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
201609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
201709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
201809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
201909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
202009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
202109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
202209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
202309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
202409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
202509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
202609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
202709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
202809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
202909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
203009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
203109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
203209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
203309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
203409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
203509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
203609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
203709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
203809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
203909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
204009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
204109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
204209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
204309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
204409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
204509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2046a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2047a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2048a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
2050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
20520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
20537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
20547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
205536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2059cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2060cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2062dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2064d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2065be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
2067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2068b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
2069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
20763af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
2077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
20783af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
2079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
20807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
20814558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
2082a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
2084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
20867a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
2087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2088e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
208988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
20903af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
20913af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
20924502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
2093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
20980d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
2099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
21000d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
210188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
2102d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
21030d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
2104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2105b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2107b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
21180d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
211987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
2120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2121d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
2122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2124cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
212609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
2127a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
2128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2131a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
2132a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
2133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
21414558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
2142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
215209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
2153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
215509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
2156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
215709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
2158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2174094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
2175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
2176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
2206