r600_shader.c revision a03d456f5a41926e39194de70b2d50776e64b8a2
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/*
272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"),
672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation
772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next
1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software.
1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */
23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h"
24de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h"
25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h"
2633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h"
27de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h"
2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h"
2972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h"
30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h"
31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h"
32de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[];
61de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
62de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader)
64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	const struct util_format_description *desc;
67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	enum pipe_format resource_format[160];
68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, nresources = 0;
69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc *bc = &shader->bc;
70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_cf *cf;
71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx *vtx;
72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return 0;
75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (cf->inst) {
80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (desc == NULL) {
85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return -EINVAL;
87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				}
88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_bc_build(&shader->bc);
99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx,
1026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			struct r600_context_state *rpshader,
1036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			const struct tgsi_token *tokens)
104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_screen *rscreen = r600_screen(ctx->screen);
106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
10836efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
10936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0);
110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rpshader == NULL)
1116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return -ENOMEM;
112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->shader.family = radeon_get_family(rscreen->rw);
113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_from_tgsi(tokens, &rpshader->shader);
114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("translation from TGSI failed !\n");
1166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_build(&rpshader->shader.bc);
119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("building bytecode failed !\n");
1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
12336efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n");
1246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return 0;
125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
12672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader)
12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
129ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
132313df4156279f84ebc5b98a7540820b994762650Jerome Glisse	unsigned i, tmp;
13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1346e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
135bd25e23bf3740f59ce8859848c715daeb9e9821fJerome Glisse	state = radeon_state(rscreen->rw, R600_VS_SHADER);
1366e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	if (state == NULL)
1376e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse		return -ENOMEM;
138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 10; i++) {
139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0;
140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1416c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	/* so far never got proper semantic id from tgsi */
1426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	for (i = 0; i < 32; i++) {
1436c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = i << ((i & 3) * 8);
1446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i / 4] |= tmp;
145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2);
147a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr) |
148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		S_028868_STACK_SIZE(rshader->bc.nstack);
1496e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = state;
1506e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1516e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1526e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->nbo = 2;
1536e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
154ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisse	rpshader->rstate->placement[2] = RADEON_GEM_DOMAIN_GTT;
155bd25e23bf3740f59ce8859848c715daeb9e9821fJerome Glisse	state->reloc_pm4_id[0] = R600_VS_SHADER__SQ_PGM_START_VS_BO_ID;
156bd25e23bf3740f59ce8859848c715daeb9e9821fJerome Glisse	state->reloc_pm4_id[1] = R600_VS_SHADER__SQ_PGM_START_FS_BO_ID;
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);
171bd25e23bf3740f59ce8859848c715daeb9e9821fJerome Glisse	state = radeon_state(rscreen->rw, 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;
211bd25e23bf3740f59ce8859848c715daeb9e9821fJerome Glisse	state->reloc_pm4_id[0] = R600_PS_SHADER__SQ_PGM_START_PS_BO_ID;
21272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
21472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader)
21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
217ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
218ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
22472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
22972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
23072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
23372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
23472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
23772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
23872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
24072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
24572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
24672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
24772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader)
25072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
25272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
25372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
25472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
26172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
27672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
280c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
281a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
28572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
286a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Src[j].Register.Indirect ||
289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Dimension ||
290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported src (indirect|dimension|absolute)\n");
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) {
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported dst (indirect|dimension)\n");
298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
30272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
30372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
30572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
31072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
31635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
34335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
34733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
35472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
35572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
35772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
360c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
361457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
36472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
377076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
378076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
379076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
380076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
382076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
383076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
384076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
385076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
4152b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[0] = immediate->u[0].Uint;
4162b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[1] = immediate->u[1].Uint;
4172b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[2] = immediate->u[2].Uint;
4182b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[3] = immediate->u[3].Uint;
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
4342b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
445457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
446457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
447c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
448c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
449c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
450c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
451c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
452c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
453c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
454c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
455c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
456c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
457c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
458457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
461c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
462c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
464457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
465457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
466457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
467457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
468457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
469457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
470457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
475b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
476c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
4775f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
478c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
479c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
49072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
491457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
492457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
493457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
494457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
495457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
496457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
498457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
501457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
502457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
503457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
504457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
505457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
506457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
507457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
508457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
509457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
510457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
511457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
512457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
514c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
515481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
516481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
517481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
518481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
519481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
520481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
521481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
522481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
523481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
524481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
525608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
526481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
527481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
528481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
529481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
530457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
531457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
532457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
533457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
534457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
535b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
536b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
537c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
538c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
539c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
540457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
541457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
542c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5731bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5837a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5847a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
5897a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
5907a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
5917a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
6067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) {
6287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
6317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].sel = r600_src[0].sel;
6327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
6337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.sel = ctx->temp_reg + j;
6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
6367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
6377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
6417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
6427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			r600_src[0].sel = ctx->temp_reg + j;
6437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
6447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
6477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
649d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
655d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	int lasti = 0;
656d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
657d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
658d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
659d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
660d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
661d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
6647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
6657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
666d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
667d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
668d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
669d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
671d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
672d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
673d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
674d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
675d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
676d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
6787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
6797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
681d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
682d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
683d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
684d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
685d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
686d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
6937a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
6947a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
6957a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
699d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
709d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
710d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
711d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
712d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
713d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
714d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
715d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
716d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
717d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
718d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
71988f5976484842671ecb2cefcfa91838a43032359Dave Airlie/*
72088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
72188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
72288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
72388f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
72488f5976484842671ecb2cefcfa91838a43032359Dave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
72588f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
72688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
72788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct r600_bc_alu_src r600_src[3];
72888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct r600_bc_alu alu;
72988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	int i, r;
73088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
73188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
73288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
73388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
73488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
73588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
73688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
73788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
73888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
73988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
74088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
74188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
74288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
74388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
74488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
74588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
74688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
74788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
74888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
74988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
750921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
75188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
752921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
75388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
75488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
75588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
75688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
75788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
75888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
75988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
76088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
76188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
76288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
76388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT;
76488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
76588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
76688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
76788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
76888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
76988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
77088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
77188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
77288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
77388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
77488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
77588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
77688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (ctx->bc->chiprev == 0) {
77788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
77888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
77988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
78088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
78188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
78288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
78388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
78588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
78688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
78788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
78988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
79088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
79188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
79288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
795921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
797921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
79888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
79988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
80288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
80488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
80588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
80888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
80988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
81088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
81188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
81288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
81388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
81488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
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
82088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
82188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
82288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
82388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.src[0].sel = ctx->temp_reg;
82488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
82588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.dst.chan = i;
82688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
82788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
82888f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
82988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
83088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (i == 3)
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	return 0;
83788f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
83888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
839094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
840094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
841094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
842094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
843094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
844094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
845094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
846094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
847094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
848094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
849921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
8507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
851094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
852094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
8537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
854094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
855094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
856094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
857094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
858094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
859094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
860094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
861094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
862094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
863094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
8640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
8650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
8660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
8680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
8690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
8717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
8727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
873921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
8747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
8757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
8767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
8797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
8807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX;
8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
889921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 0);
8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.z = NOP - fill Z slot */
9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
9027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.chan = 2;
9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
9087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
910921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
9177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
9220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
9236a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
9246a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
9256a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
9260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
9270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED;
9297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
9300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
9330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
9340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9416a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
9426a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
9430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
9450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT;
9477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
9480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
9507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
9510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
9520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
9537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]);
9540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
9570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
9580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
9590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
9600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
9610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
9670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
9690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
9700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
9710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
9720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
9790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
9800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
9810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9825cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
9835cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
9845cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9855cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
9865cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
9875cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
9885cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
9895cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
9905cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
9915cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
9925cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
9945cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
9955cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
9967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
9975cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
9985cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9995cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
10005cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
10015cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
10025cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
10035cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
10045cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
10055cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
10065cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
10075cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
10085cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
10095cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
1010a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
10117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
10127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1014a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
10157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
10167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
10177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
10187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
10197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
10207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
10217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
10237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
10247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
10257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
10267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
10277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
10287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
10297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
10307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
10317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
10327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
10337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1034a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1035a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1036a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1037a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1038a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1039a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1040a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1041a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1042a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1043a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1044a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1045a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1046a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1047a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1048a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1049a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1050a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1051a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1052a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1053a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1054a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1055a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1056a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1057a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1058a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1059a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1060a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1061a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1062a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1063a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1064a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1065a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1066a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE;
1067a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1068a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1069a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1070a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1071a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1072a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1073a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1074a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1075a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1076a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1077a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1078a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1079a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE;
1080a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1081a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1082a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1083a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1084a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1085a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1086a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1087a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1088a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1089a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1090a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1091a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1092a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1093a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
1094a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1095a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1096a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1097a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1098a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1099a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1100a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1101a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1102a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1103a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
11040d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
11050d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
11060d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11070d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
11080d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1109921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
11100d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11110d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
11120d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
11130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
11140d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11150d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
11160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
11170d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
11180d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT;
11190d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
11200d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
11210d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.write = 1;
11220d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11230d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
11240d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
11250d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1126921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
11270d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11280d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
11290d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
11300d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
11310d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
11320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
11330d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11340d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11350d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
11360d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11370d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
11380d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
11390d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
11400d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT;
11410d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
11420d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11430d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11440d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11450d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11460d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
11470d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
11480d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1149921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
11500d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
11510d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11520d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
11530d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11540d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.write = 1;
11550d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
11560d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
11570d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
11580d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11590d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11600d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
11610d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
11620d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
11630d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1164cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1165cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1166cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1167cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1168cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
11699961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
11709961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
11719961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1172cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1173cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1174cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1175cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
11766c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1177cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1178cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1179cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1180cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1181cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1182cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1183cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1184cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1185cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1186cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1187cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1188cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1189cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1190cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1191cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1192cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1193cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1194cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
12027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
12037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
12117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1215cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1224cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1225cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1226cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1227cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1228cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1229cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1231cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1232cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1233cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
12347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
12357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1239cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1240cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
12427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1243cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1244cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1245cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1246cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1247cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1248cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1249cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1250cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1251921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1252cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1253cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1254cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1255cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1256cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1257921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1258cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1259cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1260cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1261e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1262e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1263e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1264e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1265e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1266e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1267e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1268cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1269cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1278cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
128133241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
128233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
128333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
128433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1285641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1286641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1287b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1288641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1289641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1290641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1291b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1292b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1293b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1294b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
1295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].sel = src_gpr;
1296b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1298b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1299b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1300b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1301b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1302b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1303b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie
1305b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1306b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1307b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1308b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1309b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1310b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].sel = src_gpr;
1311b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1312b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1313b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1314b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1315b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1316b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1317b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1318b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1319b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1320b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1321921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1322b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1323b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1324b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1325b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1326b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1327b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1328b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1329b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1330b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1331b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	} else if (inst->Src[0].Register.File != TGSI_FILE_TEMPORARY) {
1332b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1333b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1334b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1335b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1336b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = i;
1337b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1338b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1339b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1340b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1341b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1342b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1343b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1344b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1345b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1346b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1347b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
134833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
134933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
135033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.inst = ctx->inst_info->r600_opcode;
135133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
135233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
1353641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
13546c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
135533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
135633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
135733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
135833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
135933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
136033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
136133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
136233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
13639a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
136401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
136501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
136601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
13677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
136801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
136901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
137033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	return r600_bc_add_tex(ctx->bc, &tex);
137133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
137233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1373b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1374b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1375b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1377b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1378b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1379b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1380b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
13817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
13827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1384b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1385b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1386b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1387b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD;
1388921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1389b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
13917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1392b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1393b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1394b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1395b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1396b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1397b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1398b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1399b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1400b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1401b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1402b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1403b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1404b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1405b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1406b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1407b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1408b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1410b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1411b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1412b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
14137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
14147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1415b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1416b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1417b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1418b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1419b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1420b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1421b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1422b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1423b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1424b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1426b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1427b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
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_OP3_SQ_OP3_INST_MULADD;
1433b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
14347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
14357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
14367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
14377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1438b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1439b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1440b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1441b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1442b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1443b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1444b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1445b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1446b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1447b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1448b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1449b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1450b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1451b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
145287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
145387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
145487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
145587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
145687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
145787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
145887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
145987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
146087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
146187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
146287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
146387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
146487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
146587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
146687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
146787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
146887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
146987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE;
147087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
147187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
147287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
147387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
147487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
147587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
147687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
147787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
147887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
147987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
148087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
148187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
148287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
148387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
148487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
148587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
148687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
148787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
148887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
148987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
149087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
149187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
149287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
149387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
149487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	}
149587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
149687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
149787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
149887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
149987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
15000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
15010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
15020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
15040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
15050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
15060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
15070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
15090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
15100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
15120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
15130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
15140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
15160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
15180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
15200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
15230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
15260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
15290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
15320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
15330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
15360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
15390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
15420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
15450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
15480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
15490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
15520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
15530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
15540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
15560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
15570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
15590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
15600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
15610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
15630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
15650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
15670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
15700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
15730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
15760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
15790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
15800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
15830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
15860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
15890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
15920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
15950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
15960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
15990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
16000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
16010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
16020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
16030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
16040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
16050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
16070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
16080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
16090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
16100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
16110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
16120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
16130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
16140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
16160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
16170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
16180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
16190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
16200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
16210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
16220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
162336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
162436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
162536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
162636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu_src r600_src[3];
162736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
162836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	uint32_t use_temp = 0;
162936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	int i, r;
163036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
163136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
163236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
163336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
163436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
163536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
163636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
163736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
163836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
163936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
164036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
164136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
164236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
164336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
164436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
164536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
164636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
164736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
164836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
164936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
165036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
165136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
165236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
165336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
165436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
165536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
165636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
165736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
165836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
165936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
166036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
166136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
166236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
166336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
166436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
166536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
166636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
166736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT;
166836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
166936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
167036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
167136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
167236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
167336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
167436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
167536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
167636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
167736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
167836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
167936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
168036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
168136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
168236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
168336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
168436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
168536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
168636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
168736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
168836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
168936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
169036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
169136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
169236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
169336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
169436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
169536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
169636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
169736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
169836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
169936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
170036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
170136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
170236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
170336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
170436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
170536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
170636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
170736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
170836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
170936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
171036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
171136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
171236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
171336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
171436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
171536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
171636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
171736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
171836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
171936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
172036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
172136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
172236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
172336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
172436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
172536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
172636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
172787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
1728a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
1729a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1730a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1731a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct r600_bc_alu alu, *lalu;
1732a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct r600_bc_cf *last;
1733a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
1734a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1735a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1736a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
1737a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
1738a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1739a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
1740a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
1741a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
1742a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1743a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1744a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
1745a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
1746a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1747a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
1748a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
1749a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1750a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
1751a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1752a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE);
1753a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
1754a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
1755a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1756a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1757a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1758a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1759a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
1760a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1761a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_POP);
1762a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = pops;
1763a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1764a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1765a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1766a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
1767a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1768a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1769a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1770a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	emit_logic_pred(ctx, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE);
1771a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1772a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
1773a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = FC_IF;
1774a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].mid = NULL;
1775a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
1776a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1777a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
1778a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
1782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_ELSE);
1785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
1786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	/* fixup mid */
1788a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].mid = ctx->bc->cf_last;
1789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
1790a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1791a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1792a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1793a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
1794a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
1795a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
1796a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
1797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
1798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
1799a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
1800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
1802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
1803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
1804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
1805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid->cf_addr = ctx->bc->cf_last->id + 2;
1806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
1807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp--;
1808a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
1810a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
1811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
1812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
1813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
18150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
18167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
18177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
181836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
1819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
1821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1822cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1823cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1825dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
1826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
1827d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
1828be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
1829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
1830de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1831b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
1832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
18393af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
1840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
18413af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
1842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
18437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
18444558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
1845a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
18460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
1847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
18497a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
1850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1851e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
185288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
18533af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
18543af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
1855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */
1856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
18610d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
1862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
18630d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
186488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
1865d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
18660d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
1867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
1869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
1871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
18810d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
188287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
1883de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1884d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
1885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1887cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRK,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1890a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
1891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1894a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
1895a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
1896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
19044558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
1905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1907de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CONT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1936de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1937094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
1938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
1939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
1969