r600_shader.c revision cf864fd58b2a4780482a108cd3ff86779e8fa965
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"
26de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h"
2772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h"
2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h"
29de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h"
30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h"
31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
3272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
33de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
37de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
38de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader)
39de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
40de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
41de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	const struct util_format_description *desc;
42de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	enum pipe_format resource_format[160];
43de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, nresources = 0;
44de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc *bc = &shader->bc;
45de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_cf *cf;
46de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx *vtx;
47de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
48de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
49de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return 0;
50de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
51de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
52de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
53de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
54de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (cf->inst) {
55de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
56de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
57de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
58de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
59de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (desc == NULL) {
60de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
61de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return -EINVAL;
62de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				}
63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_bc_build(&shader->bc);
74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_pipe_shader *r600_pipe_shader_create(struct pipe_context *ctx,
77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						const struct tgsi_token *tokens)
78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_screen *rscreen = r600_screen(ctx->screen);
80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_pipe_shader *rpshader = CALLOC_STRUCT(r600_pipe_shader);
81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "--------------------------------------------------------------\n");
84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissetgsi_dump(tokens, 0);
85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rpshader == NULL)
86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return NULL;
87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->shader.family = radeon_get_family(rscreen->rw);
88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_from_tgsi(tokens, &rpshader->shader);
89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("translation from TGSI failed !\n");
91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		goto out_err;
92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_build(&rpshader->shader.bc);
94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("building bytecode failed !\n");
96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		goto out_err;
97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissefprintf(stderr, "______________________________________________________________\n");
99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return rpshader;
100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	free(rpshader);
102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return NULL;
103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
10472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
10572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
10672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
107ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
10872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
10972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, j, tmp;
11172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
11272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = radeon_state_decref(rpshader->state);
11372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER);
11472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (state == NULL)
11572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 10; i++) {
117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0;
118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0, j = 0; i < rshader->noutput; i++) {
120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (rshader->output[i].name != TGSI_SEMANTIC_POSITION) {
121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			tmp = rshader->output[i].sid << ((j & 3) * 8);
122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + j / 4] |= tmp;
123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			j++;
124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2);
127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = state;
12972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo);
13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->nbo = 2;
13272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->placement[0] = RADEON_GEM_DOMAIN_GTT;
13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
13472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
13572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
138ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
13972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
14072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
14172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	unsigned i, tmp;
14272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
14372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = radeon_state_decref(rpshader->state);
14472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER);
14572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (state == NULL)
14672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
14772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	for (i = 0; i < rshader->ninput; i++) {
14872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp = S_028644_SEMANTIC(rshader->input[i].sid);
14972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_SEL_CENTROID(1);
15072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
15172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp;
15272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) |
15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse							S_0286CC_PERSP_GRADIENT_ENA(1);
15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000;
156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = 0x00000002;
15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state = state;
15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->nbo = 1;
16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->state->placement[0] = RADEON_GEM_DOMAIN_GTT;
16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
16572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
167ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
168ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
17172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
17272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
17672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
17972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
18372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
18772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
18872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
19172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
19272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
19572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
19672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
19772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
19872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rpshader)
20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
20472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_shader_tgsi_instruction;
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_shader_ctx {
221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_shader_info			info;
222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_parse_context		parse;
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	const struct tgsi_token			*tokens;
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned				type;
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned				temp_reg;
227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc				*bc;
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader			*shader;
230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestruct r600_shader_tgsi_instruction {
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned	tgsi_opcode;
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned	is_op3;
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned	r600_opcode;
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[];
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Saturate) {
251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("staturate unsupported\n");
252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
25372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
257c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
26172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Texture) {
263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("texture unsupported\n");
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
26572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Src[j].Register.Indirect ||
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Dimension ||
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported src (indirect|dimension|absolute)\n");
271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) {
276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported dst (indirect|dimension)\n");
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
28172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
28272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
28472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
28972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
33072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
33172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
33372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_output output;
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	u32 value[4];
34072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* Values [0,127] correspond to GPR[0..127].
354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Values [256,511] correspond to cfile constants c[0..255].
355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse//			R600_ERR("TGSI_TOKEN_TYPE_IMMEDIATE unsupported\n");
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			value[0] = immediate->u[0].Uint;
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			value[1] = immediate->u[1].Uint;
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			value[2] = immediate->u[2].Uint;
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			value[3] = immediate->u[3].Uint;
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_literal(ctx.bc, value);
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0, pos0 = 0; i < shader->noutput; i++) {
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&output, 0, sizeof(struct r600_bc_output));
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.gpr = shader->output[i].gpr;
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.elem_size = 3;
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_x = 0;
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_y = 1;
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_z = 2;
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.swizzle_w = 3;
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.barrier = 1;
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.array_base = i - pos0;
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.type == TGSI_PROCESSOR_VERTEX) {
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.array_base = 60;
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				pos0 = 1;
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.array_base = 0;
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
45172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == (shader->noutput - 1)) {
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			output.end_of_program = 1;
454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output);
456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (swizzle) {
488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 0:
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleX;
49072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 1:
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleY;
49372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 2:
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleZ;
496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case 3:
498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->chan = tgsi_src->Register.SwizzleW;
499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
50172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -EINVAL;
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx)
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (r)
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return r;
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx)
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r;
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[0], i, &alu.src[1]);
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[1], i, &alu.src[0]);
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
58772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
5895cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
5905cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
5915cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5925cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
5935cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
5945cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
5955cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
5965cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
5975cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
5985cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
5995cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
6005cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
6015cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
6025cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
6035cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
6045cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
6055cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
6065cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
6075cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
6085cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
6095cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
6105cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
6115cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
6125cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
6135cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
6145cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
6155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
616cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
619cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
620cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
623cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
625cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
627cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
634cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
636cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
637cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
642cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
671cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
674cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
677cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
680cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
681cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_src(ctx, &inst->Src[j], i, &alu.src[j]);
683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
688cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
691cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
693cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
694cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
697cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
702cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
713cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
7215cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans},
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
727cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt},
732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDY,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */
760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TEX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRK,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CONT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
830de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* conditional kill */
842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
873