r600_shader.c revision 094d66f45992830929d620782c70836b4b9b4a37
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
108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "--------------------------------------------------------------\n");
109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissetgsi_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	}
123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(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;
132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, j, tmp;
13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1346f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
13572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER);
13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (state == NULL)
13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 10; i++) {
139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0;
140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1416c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	/* so far never got proper semantic id from tgsi */
1426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	for (i = 0; i < 32; i++) {
1436c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = i << ((i & 3) * 8);
1446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i / 4] |= tmp;
145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2);
147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
1486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate = state;
1496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate->nbo = 2;
1526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1566f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader)
15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
158ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	unsigned i, tmp;
16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER);
16572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (state == NULL)
16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
16772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	for (i = 0; i < rshader->ninput; i++) {
1686c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = S_028644_SEMANTIC(i);
16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_SEL_CENTROID(1);
17035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR ||
17135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) {
17235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
17335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		}
17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp;
17572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) |
17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse							S_0286CC_PERSP_GRADIENT_ENA(1);
17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000;
179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = 0x00000002;
1816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate = state;
1826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate->nbo = 1;
1846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
18672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
18772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader)
18972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
190ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
191ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
19272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
19572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
19672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
19772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
19972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
20572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
20672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
20772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
21472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
21572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader)
22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
23472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
253c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
25772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Src[j].Register.Indirect ||
260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Dimension ||
261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported src (indirect|dimension|absolute)\n");
263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) {
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported dst (indirect|dimension)\n");
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
27372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
27472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
27672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
28172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
28735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
31435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
31833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
32572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
32672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
32872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_output output;
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
33472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* Values [0,127] correspond to GPR[0..127].
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Values [256,511] correspond to cfile constants c[0..255].
349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
3792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[0] = immediate->u[0].Uint;
3802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[1] = immediate->u[1].Uint;
3812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[2] = immediate->u[2].Uint;
3822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[3] = immediate->u[3].Uint;
383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0, pos0 = 0; i < shader->noutput; i++) {
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&output, 0, sizeof(struct r600_bc_output));
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.gpr = shader->output[i].gpr;
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.elem_size = 3;
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_x = 0;
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_y = 1;
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_z = 2;
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_w = 3;
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.barrier = 1;
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.array_base = i - pos0;
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.type == TGSI_PROCESSOR_VERTEX) {
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.array_base = 60;
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				pos0 = 1;
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.array_base = 0;
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
44472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == (shader->noutput - 1)) {
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			output.end_of_program = 1;
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output);
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (swizzle) {
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 0:
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleX;
48372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 1:
485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleY;
48672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 2:
488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleZ;
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 3:
491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleW;
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
49472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -EINVAL;
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5057a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
5107a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
5117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
5127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx)
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
5266c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (r)
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return r;
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
5437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
5447a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
5457a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
559094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
560094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
561094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
562094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
563094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
564094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
565094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
566094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
567094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
568094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
569094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.src[0].sel = 248;
570094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]);
571094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
572094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
573094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
574094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
575094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
576094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
577094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
578094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
579094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
580094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
581094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
582094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx)
584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r;
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
5936c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]);
597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[0]);
600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
61472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
6170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
6180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
6200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
6210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 0))
6230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
6240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.x, <- 1.0  */
6250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
6270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel  = 249; /*1.0*/
6280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
6290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
6300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if ((inst->Dst[0].Register.WriteMask & 0xe) == 0)
6330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			alu.last = 1;
6340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
6380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 1))
6410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
6420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.y = max(src.x, 0.0) */
6430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX;
6450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 0, &alu.src[0]);
6460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = 248; /*0.0*/
6490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = 0;
6500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
6510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if ((inst->Dst[0].Register.WriteMask & 0xa) == 0)
6540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			alu.last = 1;
6550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
6590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 3))
6610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
6620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.w, <- 1.0  */
6630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
6650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel  = 249;
6660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
6670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
6680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if ((inst->Dst[0].Register.WriteMask & 0x4) == 0)
6710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			alu.last = 1;
6720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
6760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
6780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
6796a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
6806a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
6816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
6820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
6830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED;
6850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 1, &alu.src[0]);
6860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
6890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
6920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
6976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
6980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
7000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
7010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT;
7020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 3, &alu.src[0]);
7030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		return r;
7050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
7060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
7070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 0, &alu.src[2]);
7080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
7110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
7120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
7130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
7140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
7150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
7160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
7200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
7210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
7220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
7230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
7240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
7250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
7280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
7290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
7320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
7330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
7340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7355cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
7365cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
7375cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7385cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
7395cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
7405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
7415cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
7425cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
7435cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
7445cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
7455cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
7465cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
7475cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
7485cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
7495cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
7505cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
7515cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
7525cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
7535cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
7545cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
7555cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
7565cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
7575cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
7585cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
7595cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
7605cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
7615cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
762cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
763cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
764cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
765cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
766cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
7679961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
7689961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
7699961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
770cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
771cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
772cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
773cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
7746c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
775cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
776cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
777cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
778cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
779cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
780cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
781cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
782cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
783cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
784cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
785cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
786cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
787cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
788cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
789cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
792cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
810cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
819cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
820cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
821cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
822cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
823cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
824cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
825cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
826cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
827cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
830cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
831cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
832cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
835cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
836cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
837cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
838cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
839cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
840cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
841cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
842cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
843cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
844cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
845cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
846cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
847cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
848cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
849cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
850cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
851cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
852cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
853cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
854cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
863cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
86633241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
86733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
86833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
86933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
870641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
871641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
872641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	int r;
873641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
874641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
875641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
876641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	/* Add perspective divide */
877641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_TXP) {
878641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
879641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
880641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = src_gpr;
881641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
882641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
883641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 3;
884641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.last = 1;
885641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
886641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
887641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
888641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
889641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
890641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
891641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
892641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
893641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
894641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].sel = src_gpr;
895641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].chan = 0;
896641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
897641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 0;
898641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
899641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
900641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
901641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
902641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
903641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
904641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
905641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
906641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].sel = src_gpr;
907641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].chan = 1;
908641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
909641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 1;
910641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
911641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
912641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
913641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
914641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
915641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
916641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
917641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
918641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].sel = src_gpr;
919641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].chan = 2;
920641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
921641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 2;
922641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
923641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
924641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
925641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
926641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
927641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
928641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = 249;
929641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 0;
930641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
931641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 3;
932641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.last = 1;
933641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
934641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
935641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
936641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
937641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		src_gpr = ctx->temp_reg;
938641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	}
93933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
940641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	/* TODO use temp if src_gpr is not a temporary reg (File != TEMPORARY) */
94133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
94233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.inst = ctx->inst_info->r600_opcode;
94333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
94433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
945641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
9466c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
94733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
94833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
94933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
95033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
95133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
95233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
95333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
95433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
955641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_x = 1;
956641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_y = 1;
957641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_z = 1;
958641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_w = 1;
95933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	return r600_bc_add_tex(ctx->bc, &tex);
96033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
96133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
970b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
971b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
972b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD;
973b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = 249;
974b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]);
976b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
986b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
988b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
989b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
991b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
998b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[2], i, &alu.src[1]);
1000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1002b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1003b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1004b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1005b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1006b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1007b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1008b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1009b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1010b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1011b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1012b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1013b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1014b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1015b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1016b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1017b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1018b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1019b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
1020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
1021b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[0]);
1022b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1023b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1024b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[1]);
1025b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1027b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1028b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1029b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1030b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1031b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1032b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1033b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1034b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1035b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1036b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1037b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1038b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1039b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1040b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
1042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
10440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
10465cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans},
1047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
1050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1051cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1052cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
1056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt},
1057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
1059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1060b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
1061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
10727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans},
1073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
10787a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
1079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDY,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */
1085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1097641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	{TGSI_OPCODE_TEX,	0, 0x10, tgsi_tex},
1098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
109933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	{TGSI_OPCODE_TXP,	0, 0x10, tgsi_tex},
1100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */
1111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1116cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRK,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CONT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1166094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
1167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
1168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
1198