r600_shader.c revision b346c4205dc19c9ffbff48ed8bd89687772a96f8
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
101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_pipe_shader *r600_pipe_shader_create(struct pipe_context *ctx,
102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						const struct tgsi_token *tokens)
103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_screen *rscreen = r600_screen(ctx->screen);
105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_pipe_shader *rpshader = CALLOC_STRUCT(r600_pipe_shader);
106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "--------------------------------------------------------------\n");
109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissetgsi_dump(tokens, 0);
110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rpshader == NULL)
111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return NULL;
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");
116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		goto out_err;
117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_build(&rpshader->shader.bc);
119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("building bytecode failed !\n");
121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		goto out_err;
122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "______________________________________________________________\n");
124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return rpshader;
125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	free(rpshader);
127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return NULL;
128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
12972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
132ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
13472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, j, tmp;
13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = radeon_state_decref(rpshader->state);
13872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER);
13972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (state == NULL)
14072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 10; i++) {
142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0;
143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0, j = 0; i < rshader->noutput; i++) {
145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (rshader->output[i].name != TGSI_SEMANTIC_POSITION) {
146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			tmp = rshader->output[i].sid << ((j & 3) * 8);
147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + j / 4] |= tmp;
148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			j++;
149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2);
152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = state;
15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo);
15672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->nbo = 2;
15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->placement[0] = RADEON_GEM_DOMAIN_GTT;
15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
163ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
16572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	unsigned i, tmp;
16772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
16872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = radeon_state_decref(rpshader->state);
16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER);
17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (state == NULL)
17172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
17272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	for (i = 0; i < rshader->ninput; i++) {
17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp = S_028644_SEMANTIC(rshader->input[i].sid);
17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_SEL_CENTROID(1);
17572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp;
17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) |
17972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse							S_0286CC_PERSP_GRADIENT_ENA(1);
18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000;
181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = 0x00000002;
18372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = state;
18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->nbo = 1;
18672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->placement[0] = RADEON_GEM_DOMAIN_GTT;
18772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
18872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
18972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
19172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
192ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
193ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
19572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
19672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
19772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
19872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
19972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
20472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
20572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
20772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
20872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
20972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
21272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
21572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
22972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
23672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
25172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Saturate) {
253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("staturate unsupported\n");
254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
25572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
259c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
26372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Src[j].Register.Indirect ||
266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Dimension ||
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported src (indirect|dimension|absolute)\n");
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) {
274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported dst (indirect|dimension)\n");
275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
27972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
28072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
28272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
28772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
32233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
32972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
33072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
33272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_output output;
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
33872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* Values [0,127] correspond to GPR[0..127].
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Values [256,511] correspond to cfile constants c[0..255].
353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
3832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[0] = immediate->u[0].Uint;
3842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[1] = immediate->u[1].Uint;
3852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[2] = immediate->u[2].Uint;
3862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[3] = immediate->u[3].Uint;
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
4022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0, pos0 = 0; i < shader->noutput; i++) {
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&output, 0, sizeof(struct r600_bc_output));
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.gpr = shader->output[i].gpr;
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.elem_size = 3;
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_x = 0;
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_y = 1;
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_z = 2;
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_w = 3;
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.barrier = 1;
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.array_base = i - pos0;
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.type == TGSI_PROCESSOR_VERTEX) {
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.array_base = 60;
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				pos0 = 1;
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.array_base = 0;
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
44872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == (shader->noutput - 1)) {
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			output.end_of_program = 1;
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output);
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (swizzle) {
485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 0:
486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleX;
48772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 1:
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleY;
49072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 2:
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleZ;
493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 3:
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleW;
496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
49872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -EINVAL;
499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx)
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (r)
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return r;
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx)
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r;
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]);
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[0]);
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
58472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
5860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
5870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
5880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
5900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
5910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
5920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 0))
5930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
5940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.x, <- 1.0  */
5950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
5960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
5970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel  = 249; /*1.0*/
5980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
5990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
6000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if ((inst->Dst[0].Register.WriteMask & 0xe) == 0)
6030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			alu.last = 1;
6040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
6080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 1))
6110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
6120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.y = max(src.x, 0.0) */
6130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX;
6150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 0, &alu.src[0]);
6160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = 248; /*0.0*/
6190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = 0;
6200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
6210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if ((inst->Dst[0].Register.WriteMask & 0xa) == 0)
6240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			alu.last = 1;
6250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
6290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 3))
6310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
6320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.w, <- 1.0  */
6330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
6350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel  = 249;
6360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
6370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
6380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if ((inst->Dst[0].Register.WriteMask & 0x4) == 0)
6410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			alu.last = 1;
6420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
6460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
6480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
6496a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
6506a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
6516a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
6520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
6530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED;
6550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 1, &alu.src[0]);
6560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
6590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
6620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6666a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
6676a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
6680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
6700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT;
6720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 3, &alu.src[0]);
6730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		return r;
6750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
6760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
6770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_src(ctx, &inst->Src[0], 0, &alu.src[2]);
6780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
6810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
6820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
6830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
6840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
6850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
6890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
6900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
6910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
6920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
6930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
6940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
6950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
6960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
6970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
6980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
6990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
7020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
7030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
7040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7055cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
7065cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
7075cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7085cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
7095cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
7105cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
7115cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
7125cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
7135cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
7145cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
7155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
7165cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
7175cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
7185cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
7195cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
7205cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
7215cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
7225cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
7235cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
7245cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
7255cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
7265cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
7275cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
7285cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
7295cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
7305cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
7315cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
732cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
733cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
734cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
735cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
736cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
7379961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
7389961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
7399961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
740cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
741cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
742cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
743cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
744cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
745cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
746cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
747cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
748cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
749cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
750cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
751cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
752cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
753cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
754cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
755cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
756cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
757cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
758cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
759cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
760cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
761cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
779cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
788cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
789cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
792cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
793cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
794cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
795cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
796cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
799cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
800cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
801cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
804cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
805cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
806cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
807cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
808cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
809cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
810cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
811cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
812cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
813cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
814cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
815cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
816cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
817cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
818cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
819cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
820cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
821cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
822cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
823cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
830de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
832cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
83533241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
83633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
83733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
83833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
839641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
840641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
841641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	int r;
842641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
843641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
844641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
845641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	/* Add perspective divide */
846641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_TXP) {
847641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
848641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
849641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = src_gpr;
850641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
851641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
852641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 3;
853641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.last = 1;
854641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
855641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
856641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
857641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
858641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
859641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
860641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
861641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
862641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
863641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].sel = src_gpr;
864641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].chan = 0;
865641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
866641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 0;
867641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
868641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
869641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
870641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
871641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
872641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
873641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
874641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
875641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].sel = src_gpr;
876641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].chan = 1;
877641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
878641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 1;
879641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
880641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
881641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
882641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
883641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
884641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
885641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
886641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 3;
887641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].sel = src_gpr;
888641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[1].chan = 2;
889641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
890641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 2;
891641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
892641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
893641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
894641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
895641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
896641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
897641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].sel = 249;
898641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.src[0].chan = 0;
899641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.sel = ctx->temp_reg;
900641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.chan = 3;
901641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.last = 1;
902641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		alu.dst.write = 1;
903641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
904641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		if (r)
905641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse			return r;
906641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse		src_gpr = ctx->temp_reg;
907641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	}
90833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
909641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	/* TODO use temp if src_gpr is not a temporary reg (File != TEMPORARY) */
91033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
91133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.inst = ctx->inst_info->r600_opcode;
91233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
91333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
914641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
91533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Src[0].Register.Index;
91633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
91733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
91833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
91933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
92033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
92133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
92233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
92333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
924641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_x = 1;
925641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_y = 1;
926641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_z = 1;
927641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.coord_type_w = 1;
92833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	return r600_bc_add_tex(ctx->bc, &tex);
92933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
93033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
931b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
932b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
933b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
934b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
935b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
936b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
937b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
938b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
939b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
940b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
941b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD;
942b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = 249;
943b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
944b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]);
945b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
946b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
947b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
948b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
949b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
950b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
951b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
952b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
953b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
954b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
955b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
956b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
957b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
958b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
959b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
960b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[2], i, &alu.src[1]);
969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
970b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
971b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
972b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
973b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
974b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
976b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
986b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
988b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
989b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[0]);
991b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[1]);
994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
998b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1002b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1003b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1004b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1005b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1006b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1007b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1008b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1009b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
1011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
10130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
1014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
10155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans},
1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
1019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1020cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1021cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
1025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt},
1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
1028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1029b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
1030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1033de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1035de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1040de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1044de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDY,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */
1054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1060de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1066641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	{TGSI_OPCODE_TEX,	0, 0x10, tgsi_tex},
1067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
106833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	{TGSI_OPCODE_TXP,	0, 0x10, tgsi_tex},
1069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */
1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1085cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRK,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CONT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* conditional kill */
1136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
1137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
1167