r600_shader.c revision 7779f6d1dffde2c0501e44adc342e52803de08d4
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"
24f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák#include "tgsi/tgsi_info.h"
25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h"
26de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h"
2733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h"
28de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h"
299c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h"
30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h"
31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
32077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h"
33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h"
3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
37843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano#include <byteswap.h>
38843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano
397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie/* CAYMAN notes
407779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieWhy CAYMAN got loops for lots of instructions is explained here.
417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie-These 8xx t-slot only ops are implemented in all vector slots.
437779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT
447779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops, with all four
457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieslots expecting the arguments on sources a and b. Result is
467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliebroadcast to all channels.
477779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT
487779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops in the z, y, and
497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliex slots.
507779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64
517779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64
527779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSQRT_IEEE/_64
537779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSIN/COS
547779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe w slot may have an independent co-issued operation, or if the
557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieresult is required to be in the w slot, the opcode above may be
567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieissued in the w slot as well.
577779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe compiler must issue the source argument to slots z, y, and x
587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie*/
597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
61dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs,
621235becaa1cf7e29f580900592563c3329d326deJerome Glisse				struct r600_shader *ps, int id)
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader_io *input = &ps->input[id];
651235becaa1cf7e29f580900592563c3329d326deJerome Glisse
66d1b8f8e8b3b41ab6092fa3f18a4891a0198f64deDave Airlie	/* position/face doesn't get/need a semantic index */
67d1b8f8e8b3b41ab6092fa3f18a4891a0198f64deDave Airlie	if (input->name == TGSI_SEMANTIC_POSITION || input->name == TGSI_SEMANTIC_FACE)
68d1b8f8e8b3b41ab6092fa3f18a4891a0198f64deDave Airlie		return 0;
69d1b8f8e8b3b41ab6092fa3f18a4891a0198f64deDave Airlie
701235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (int i = 0; i < vs->noutput; i++) {
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (input->name == vs->output[i].name &&
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse			input->sid == vs->output[i].sid) {
731235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return i - 1;
741235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
751235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
761235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
771235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
781235becaa1cf7e29f580900592563c3329d326deJerome Glisse
79a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
801235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
811235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
821235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
83843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	uint32_t *ptr;
84843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	int	i;
851235becaa1cf7e29f580900592563c3329d326deJerome Glisse
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
871235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
8829c4a15bf61a76cd71ffa5b8f09706d0eab84281Keith Whitwell		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0);
891235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
901235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
911235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
92843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		ptr = (uint32_t*)r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
93d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		if (R600_BIG_ENDIAN) {
94d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			for (i = 0; i < rshader->bc.ndw; ++i) {
95d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
96d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			}
97d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		} else {
98d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
99843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		}
100294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1171235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1211235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1221235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1231235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1243b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
1253b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
126dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
128052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1311235becaa1cf7e29f580900592563c3329d326deJerome Glisse
132c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
133c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
134c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
135c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
136052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
138052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
139052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		tgsi_dump(tokens, 0);
140052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse	shader->shader.family = r600_get_family(rctx->radeon);
1423b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	r = r600_shader_from_tgsi(tokens, &shader->shader);
1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_bc_build(&shader->shader.bc);
1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1501235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
152052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
153052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		r600_bc_dump(&shader->shader.bc);
154052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
155052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
156afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1571235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1581235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15969251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
160ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
163ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	r600_bo_reference(rctx->radeon, &shader->bo, NULL);
164f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck	r600_bc_clear(&shader->shader.bc);
165ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
166ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1691235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1702b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1712b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
177a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
178a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
179a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
180a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
188077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned				ar_reg;
1892b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
1902b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
1912b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
1921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	struct r600_shader_src			src[3];
193cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
194cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
195e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
196fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
197fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
198fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
199fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
200fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
21142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
225c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
23072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
231a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2338260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2348260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2358260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
24047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
24147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
24950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
25050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
25150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
268fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
272fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
273fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
274fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
285fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
28750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
28850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
292fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
293fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
294fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
30050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
30150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
30250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
30350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
3047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
30872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
31196bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
31272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
31835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
3198a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
3217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev >= CHIPREV_EVERGREEN) {
32250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
323fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
324fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
325fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
326fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
327fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
328fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
32950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
33635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
34033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
34147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
34396bbc627f369c0100b950f81531b1fe9ef586c34Christian König
344c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
345c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
346c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			struct r600_bc_alu alu;
347c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			memset(&alu, 0, sizeof(struct r600_bc_alu));
34896bbc627f369c0100b950f81531b1fe9ef586c34Christian König
349c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
350c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
351c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
35296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
35396bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
35496bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
35596bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
356c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
35796bbc627f369c0100b950f81531b1fe9ef586c34Christian König
358c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			if ((r = r600_bc_add_alu(ctx->bc, &alu)))
359c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
360c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
361c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		}
36296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
36872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
36972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
370be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
371be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
372be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
373be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
374be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
3757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
376fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
377fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
379fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
380fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
381fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
382fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
384fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
385fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
387fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
388fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
389fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
390fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
395fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
396fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
397fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
398fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
399fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
400fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
401fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
404fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
405fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
406fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
408fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
409fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
410fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
411fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
413fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
414fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
4221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
4231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
4241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
4251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
4261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
4271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
4281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
4291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
4301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
4311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
4321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
43396bbc627f369c0100b950f81531b1fe9ef586c34Christian König
4341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
4351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
4361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
4371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
4381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
4391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
4401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
4411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
4421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
4431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
4441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
4451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
4461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
4471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
44896bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
449c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		/* assume we wan't TGSI_SEMANTIC_INSTANCEID here */
450c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[0] = 3;
451c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[1] = 3;
452c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[2] = 3;
453c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[3] = 3;
454c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->sel = 0;
455c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
4561fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
4571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
4581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
4591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
4601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
4611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
4621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
463077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
464077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
465077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	struct r600_bc_vtx vtx;
466077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
467077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
468077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
469077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
470077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		struct r600_bc_alu alu;
471077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
472077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
473077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
474077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
475077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
476077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
477077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
478077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
479077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
480077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
481077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
482077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
483077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
484077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
485077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
486077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
487077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
488077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
489077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = ctx->ar_reg;
490077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
491077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
492077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
493077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
494077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
495077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
496077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
497077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
498077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
499077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
500077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
501077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
502077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
503077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
504077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
505d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
506077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
507077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if ((r = r600_bc_add_vtx(ctx->bc, &vtx)))
508077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
509077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
510077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
511077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
512077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5137687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
5147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
5157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct r600_bc_alu alu;
5177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
5187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
5207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
5217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
5227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
5247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
526077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
527077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
528077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
529077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
530077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
531077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
532077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
533077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
534077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
535077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
536077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
537077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
538077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
5397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
5407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
5417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				memset(&alu, 0, sizeof(struct r600_bc_alu));
5427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
5437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
5447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
5457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
5467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
5477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
5487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
5497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
5507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
5517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				r = r600_bc_add_alu(ctx->bc, &alu);
5527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
5537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
5547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
5557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
5567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
5577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
5587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
5617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
5627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
5647687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
5657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
5667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct r600_bc_alu alu;
5687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
5697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
5717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
5727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
5737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
5767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
5777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
5787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
5797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				memset(&alu, 0, sizeof(struct r600_bc_alu));
5807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
5817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
5827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
5837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
5847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
5857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
5867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
5877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
5887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
5897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				r = r600_bc_add_alu(ctx->bc, &alu);
5907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
5917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
5927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
5987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
5997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6003b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
60172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
6035555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
605c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
606457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
60972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
620f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
623076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
624076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
625076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
626f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
627f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
628f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
630076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
631076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
632076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
633076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
6487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx.bc->chiprev >= CHIPREV_EVERGREEN) {
649f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
650f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
651f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
652f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
6547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev >= CHIPREV_EVERGREEN) {
655fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
65684457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
661d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
66297e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
66397e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
66497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
665d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
6667728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
667077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	ctx.ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
669077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	ctx.temp_reg = ctx.ar_reg + 1;
670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
671cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
672cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
6735555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
679cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
680cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
681cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
682cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
683cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
684cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
685cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
686cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
687cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
688cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
699be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
700be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
701be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
7021fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
7037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
7047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
7057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
7067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
7077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
7087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (ctx.bc->chiprev == CHIPREV_CAYMAN)
7097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
7107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			else if (ctx.bc->chiprev >= CHIPREV_EVERGREEN)
71150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
71250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
71350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
718876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
7195555cd776b970bce020be59193054474a2a63317Dave Airlie			property = &ctx.parse.FullToken.FullProperty;
7205555cd776b970bce020be59193054474a2a63317Dave Airlie			if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
7215555cd776b970bce020be59193054474a2a63317Dave Airlie				if (property->u[0].Data == 1)
7225555cd776b970bce020be59193054474a2a63317Dave Airlie					shader->fs_write_all = TRUE;
7235555cd776b970bce020be59193054474a2a63317Dave Airlie			}
724876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
732457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
733457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
734c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
735c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
736c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
737c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
738c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
739c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
740c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
7418ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[i].burst_count = 1;
742c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
743c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
744c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
745a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
746457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
749c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
750c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
752457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
753457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
754457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
755457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
756457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
757457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
758457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
763b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
764c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
7655f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
766c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
767b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
76839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
76939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
77039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
77139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
77239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
77339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
77439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
77539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
776c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
78772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
788457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
789457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
790457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
791457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
792457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
795457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
796457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
797457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
798457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
799457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
800457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
801457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
802457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
803457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
804457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
8058ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
806457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
807457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
808457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
8097e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
810457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
812c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
813481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
814481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
815481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
816481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
817481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
818481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
819481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
820481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
821481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
8228ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
823481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
824608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
825481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
826a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
827481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
828481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
829457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
830457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
8317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx.bc->chiprev < CHIPREV_CAYMAN) {
8327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
8337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
8347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
835457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
836b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
837b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
838a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
839c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
840c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
841457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
842457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
843c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
8477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
8487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (ctx.bc->chiprev == CHIPREV_CAYMAN)
8497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		cm_bc_add_cf_end(ctx.bc);
8507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
8513b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
855cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
862f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
863f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
872a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic void r600_bc_src(struct r600_bc_alu_src *bc_src,
873a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
874a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
875a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
876a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
877a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
878a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
879a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
880a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
881a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
882a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
883a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
88480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
88580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
88680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
88780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     struct r600_bc_alu_dst *r600_dst)
888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
8897a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8907a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
894de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
89547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
89647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
8977a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
8987a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
8997a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
902dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
904dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
905d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
906d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
907dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
908d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
909d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
910d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
911dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
912dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
913dffad730df17983cfaef0808555a8c26cad0aa15Christian König
914dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
915dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
916dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
917dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct r600_bc_alu alu;
918dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
919dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
921d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
922d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
923d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
924d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
92680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
928d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
929d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				r600_bc_src(&alu.src[j], &ctx->src[j], i);
932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
933d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
9341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[1], i);
9351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], i);
936de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
9427a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
9437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
9446372660d122f4056dffb56d1b93dbd1bbc661f67Dave Airlie			if (alu.src[0].neg)
9456372660d122f4056dffb56d1b93dbd1bbc661f67Dave Airlie			  alu.src[0].neg = 0;
9467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
950d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
960d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
961d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
962d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
963d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
964d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
965d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
966d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
967d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
968d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
969d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
9707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
9717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
9727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
9747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct r600_bc_alu alu;
9757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
9767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
9787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
9797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
9807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[j], &ctx->src[j], 0);
9827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
9837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
9857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
9877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
9887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
9897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
9907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
9917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
9927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
9937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
9947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9957ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
10001fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
100188f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
100296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
100396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
100496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
100596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
100696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
100792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
10087ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1010a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
101388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
101488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
101588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
10171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
10187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1019921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1021a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
102296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1023ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
102788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1030a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
10317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1044a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
104988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
10537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1054921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
105588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1056921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1057ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
105896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
105996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	if (ctx->bc->chiprev == CHIPREV_R600) {
1060a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1061a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
106296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
106396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
106496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
106596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
106696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
106796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
106888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
106988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
107088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
107188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
107292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
107392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
107492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
10757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
10767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
10777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct r600_bc_alu alu;
10797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
10807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
10817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
10837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
10847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
10857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
10887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
10897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
10907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
10917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
10947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
10967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
10977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
10987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
10997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
11007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
11017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
11027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
11037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
11047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
11057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
110692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
110792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
110892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
110992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
111092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1111dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
111292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
11131fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
111492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
111592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
112188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
112588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
112688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
112788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
112888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
112988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
113088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1131be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1132be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1133be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1134be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
113588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1136a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1137be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1138be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
113980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1140be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
114188f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
114288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
114388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
114488f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
114588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
114688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
114788f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
114888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
114992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
115092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
115192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
115292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
11537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
115492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
115557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
115657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
115757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
115857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
11591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
116057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
116157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
116257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
116392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
116492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
116557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
11667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
11677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
11687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
11697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
11707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
11737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
11747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
11757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
11767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
11777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
11787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
11797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
11807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
11817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
11827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
11837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
11847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
11857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
11867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
11877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
118892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
11897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
11907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
11917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
11927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
11937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
11947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
11957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
119657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
119792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
119892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
119957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
12007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
12017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
12027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
12037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
12047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
12067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
12077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
12087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
12097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
12107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
12117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
12127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
12137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
12147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
12157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
12167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
12177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
12187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
12197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
12207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
122157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
12227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
12237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
12247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
12257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
12267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
12277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
12287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
122957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
123092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1231ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1232ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1233ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1234ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1235ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1236ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
123780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1238ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1239ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1240ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1241ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1242ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1243ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1244ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1245ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1246ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1247ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1248ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1249ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1250ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1251ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1252ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1253ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1254ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
125580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1256ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1257ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1258ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1259ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1260ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1261ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1262ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1263ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1264ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1265ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1266ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
126792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
126892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
126992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1270094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1271094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1272094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1273094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1274094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1275094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1276094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1277094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
12784502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1279094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
12804502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1281921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
12824502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12834502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
12844502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
12854502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
12864502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
12871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], i);
12884502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1289094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1290094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1291094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1292094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1293094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1294094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1295094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
12964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12974502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
12984502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
12994502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1300094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1301094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1302094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
13030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
13050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
13070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
13080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
13107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1311a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1312921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
13137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
131480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
13157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
13167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
13217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1322a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
13231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
1324921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
132585e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
132680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
13277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
13287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
13337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1334a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1335921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
13367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
133780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
13387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
13397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
13407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
13450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
13466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
13476a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
13487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
13496a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
13507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = log(src.y) */
13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
13547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
13557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 1);
13567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
13587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
13597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
13617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = log(src.y) */
13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
13707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 1);
13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
13757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
13767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
13777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
13780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13796a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
13806a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
13810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
13830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1384a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
13851fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 3);
13860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
13870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1388ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
13891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[0], 0);
13900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
13910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
13920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
13930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
13940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
14017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
14027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
14037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
14057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
14067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
14087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
14097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
14107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
14117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
14127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
14137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
14147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
14157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
14167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
14177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
14187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
14197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
14217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
14227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
14237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
14257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
14280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
14290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
14300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
14310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
143242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
143342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
143442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
143542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
143642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
143742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
143842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1439df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1440df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1441df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1442df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1443df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1444df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1445df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
144642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
14471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[i], &ctx->src[i], 0);
144842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
144942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
145042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
145142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
145242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
145342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
145442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
145542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
145642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
145742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
145842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
145942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
14617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
14627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
14657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
14667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
14677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
14687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
14707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
147180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
14747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
14757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
14767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
14797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
14807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
14817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1482a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1485a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1486a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
14911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[i], &ctx->src[i], 0);
1492a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1496a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1497a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1498a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1499a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1500a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1502a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
15047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
15057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
15077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct r600_bc_alu alu;
15087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
15097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
15157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
15167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
15187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r600_bc_src(&alu.src[0], &ctx->src[1], 0);
15287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
15337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
15347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
15377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
15387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
15407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
15417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
15517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
15527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1553a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1555a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1557a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1558a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1560a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
15611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1567a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1568a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1569a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
157066f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
15711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[1], 0);
1572a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1574a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1575a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1576a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1580a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1581a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1582a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1586a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1587a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1588a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1589a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1590a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1591a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15920d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
15930d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
15940d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15950d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
1596921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
15970d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15980d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
15990d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1601a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16020d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1603cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
16040d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1605cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
16060d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
1608921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[0], i);
16100d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16120d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16150d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
16170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16180d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
16190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16200d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1621a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16220d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
162380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16240d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1626cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
16270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
16280d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1629921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16300d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
16310d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1633cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
16340d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16360d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16390d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
16410d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
16420d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
16430d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1652a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
16536c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1655a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
165680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1661cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1665cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1666cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1667cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1668cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1675dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
16777be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
16787be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
16797be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
16807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[j], &ctx->src[j], i);
1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
16867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
168780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
16917be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1702cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1710cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[j], &ctx->src[j], i);
1712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1713a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
171480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1715cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1716a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1718cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1721921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1723cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1727921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1728cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1729cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1730cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1731e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1732e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1733e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1734e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1735e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1736e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1737e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1738cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1739cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
17487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
175133241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
175233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
175396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
175433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
175533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1756641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1757641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1758b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1759bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1760da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
1761da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
176278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	const boolean src_requires_loading =
1763da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler		(inst->Src[0].Register.File != TGSI_FILE_TEMPORARY &&
1764da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler		inst->Src[0].Register.File != TGSI_FILE_INPUT) ||
1765da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler		ctx->src[0].neg || ctx->src[0].abs;
176678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
1767641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1768641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1769641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1770b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
17717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
1772b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
17737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
17747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
17757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
17767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
17777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
17787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 3);
1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
17807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
17817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
17827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
17837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
17847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
17857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
17867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
17877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
17887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
17897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
17907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
17927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
17937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
17947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
17957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 3);
17967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
17987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
17997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
18017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
18027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
18037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
18047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18059d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1806b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1807b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1808a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1809b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
18107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
18111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], i);
1812b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1813b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1814b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1815b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1816b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1817b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1818b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1819b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1820a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1821921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1822b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1823b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1824b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1825b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1826b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1827b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1828b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1829b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
183078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
1831b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
18350e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
18360e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1841a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
18420e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
18430e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
18557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
18567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
18577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
18587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
18597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
18607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
18617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
18627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
18637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
18647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
18657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
18677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
18737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
18747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
18757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
18767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
18777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
18787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
18797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
18807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
18817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
18837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
18847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
18857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1888bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
18897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
1890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1892a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
18997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1902a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1913a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
19207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1922bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1923a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1924bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1925bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1926bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1932bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
193478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1936bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
193878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
1939b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1940b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1941a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
19421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], i);
1943b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1944b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1945b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1946b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1947b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1948b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1949b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1950b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1951b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
195278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
1953b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1954b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
19557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
196033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
196133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
1963ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
1964077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
1965641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
19666c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
19679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
19689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
19699d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
19709d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
197178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
197278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
197378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
197478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
197578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
197678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
197778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
197878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
197978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
198078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
1981244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
198278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
19839a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1987bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1989bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1990bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
199101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
199201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
199301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
19947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
199501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
199601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
1997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
199869d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) {
199969d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
200078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = tex.src_sel_y;
200169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY)
200269d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
200369d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2004bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
200578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2006bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2007bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
2008bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2009bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2010bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2011bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2012bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
201333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
201433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2015b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2016b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2017b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2018b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
2019dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2021b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2022b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2023c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
20241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2025c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2026c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2027c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2028c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2029c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			memset(&alu, 0, sizeof(struct r600_bc_alu));
2030c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
20311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[1], i);
20321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[2], i);
2033c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
203480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2035c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2036c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2037c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2038c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
2039c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			r = r600_bc_add_alu(ctx->bc, &alu);
2040c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2041c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2042c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2043c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2044c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2045c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2046b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2047dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2048dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2049dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2050dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2051b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2052a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2053921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2054b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
20551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[0], i);
2056b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
2057b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2058b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2059dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2060b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2061b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2062b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2063b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2064b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2065b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2066b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2067b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2068b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2069dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2070dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2071dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2072dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2073b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2074a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2075b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2076b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
20771fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[2], i);
2078b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2079b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2080dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2081b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2082b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2084b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2085b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2086b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2087b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2088b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2089b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2090dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2091dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2092dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2093dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2095a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2096b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
20971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
20981fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[1], i);
2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2100b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2101dffad730df17983cfaef0808555a8c26cad0aa15Christian König
210280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2103b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2104dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2105b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2106b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2107b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2108b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2109b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2110b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2111dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2112b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2113b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
211487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
211587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
211687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
211787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
211887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2119dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
212087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
21217be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
21227be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
21237be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
212487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
212587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2126a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
21271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
21281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[2], i);
21291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[1], i);
213080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
213187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
213287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
213387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
21347be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
213587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
213687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
213787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
213887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
21397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
214087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
214187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
214287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21460e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
21470e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
21500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2157a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
21580e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
21590e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
21600e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
21610e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
21730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2181a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
21820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21830e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
21840e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
21850e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
21860e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
21940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
21950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
219980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
220080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
221636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
221736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
221836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
221909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
22207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
222136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
222236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
222336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
222436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
222536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2226a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
22271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
222836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
222936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
223036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
223136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
223236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
223336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
223436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
223536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
22377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
22387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
22417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
224236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
22437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
22447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
22457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
22467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
22487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
22507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
22547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
22597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
226636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
22677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
226836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
226936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2272a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
22731fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2276b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2277b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2278b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2279b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2280b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
228236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
228436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
228536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
228636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
22937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
22947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
22967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
229836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
22997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
23007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
23017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
23027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
230536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
23077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
23127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
231436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
23167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
232536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
232636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
232736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
232836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
232936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
233036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2331a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
233236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
233336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
233436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
233536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
233836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
233936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
234136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
234236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
234336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
234587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
23517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
23557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
23567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
2358460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
23597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
23607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
23617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
23637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
23647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
23657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
23677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
23697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2372460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
23737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
23757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
23777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
23787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
23807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
23817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
23827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
23847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2387460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2388460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2389460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2390460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2391460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2392460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2393460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2394460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2395460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2396460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2397460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2398460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2399460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2400460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2401460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
240296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2403460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2404460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
24057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
24067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
24157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
24207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
24237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
24257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
24287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
24317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
24357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
243896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
243996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
244096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
244296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
244396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
244496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
244696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
244796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
244896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
244996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
245096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
245196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
245296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
245396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
24557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
24647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
246796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
24697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
24727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
247796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
24807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
248296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
248796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
24917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
24927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
24937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
24947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
24987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
25017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
25037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
25087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
25097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
25107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
251196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
25147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
251696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
25187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
252196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
252396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
252796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
252996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2530460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2531460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2532460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2533460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2534460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2535460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2536460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2537460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2538460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2539460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2540460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2541460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2542460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
25437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
25447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
2546460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2549460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
2556460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
25587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
25637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
25667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
25707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
25717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
25737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2576460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2577460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2578460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2579460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2580460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2581460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2582460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2583460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2584460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2585460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2586460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2587460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2588460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2589460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2590460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2591460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2592460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2593460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2594460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2595460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2596460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2597460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2598460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
259998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
260098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
260198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
260298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct r600_bc_alu alu;
260398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
2604a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
260598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
260698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
260752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
260852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
260952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
261052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
261152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
261252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
261352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
261452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
261552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
261652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
261752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
261852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
26191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
262098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2621077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.dst.sel = ctx->ar_reg;
262298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
2623495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
262498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
262598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
2626077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2627077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	/* TODO: Note that the MOVA can be avoided if we never use AR for
2628077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * indexing non-CB registers in the current ALU clause. Similarly, we
2629077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * need to load AR from ar_reg again if we started a new clause
2630077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * between ARL and AR usage. The easy way to do that is to remove
2631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * the MOVA here, and load it for the first AR access after ar_reg
2632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * has been modified in each clause. */
263398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
263498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2635077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
263698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
263798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2638495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
263998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
264098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
264198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
264298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
264398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
264447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
264547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
264647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
264747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
264847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
2649a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
26507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
26517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
2652077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2653077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
2654077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2655077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2656077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2657077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2658077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2659077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2660077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
2661077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2662077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2663077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2664077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
2665077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2666077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2667077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2668077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2669077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2670077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
26717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
26727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
2673077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2674077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2675077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2676077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2677077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2678077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2679077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2680077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2681077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
26827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
26837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
26847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
26857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
26867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
26877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2688077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&alu, 0, sizeof(alu));
2689077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2690077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
269147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
269247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2693495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
269447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
269547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2696c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
269747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
269847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
269947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
270057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
270157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
270257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
270357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
270457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
270557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
270657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
270757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
270857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2709a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
271080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
27117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
27127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
271357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
271457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
27151fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], i);
271657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
271757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2718a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
271957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
272057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
27211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], i);
272257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
272357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
272457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
272557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
272657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
272757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
272857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
272957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
273057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
273157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2732a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2733a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2735a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2736a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2737a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2738a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2739a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2740a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2741a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2742a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2743a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2744a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
27451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2746a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2747a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
27487ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2749a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2750a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2751a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2752a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2753a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2754a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2755a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2756a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2757a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2758a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
27598813842121d46d1be476807c98b0ba0b771f0c91Christian König	int alu_pop = 3;
27608813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (ctx->bc->cf_last) {
27618813842121d46d1be476807c98b0ba0b771f0c91Christian König		if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
27628813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 0;
27638813842121d46d1be476807c98b0ba0b771f0c91Christian König		else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
27648813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 1;
27658813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
27668813842121d46d1be476807c98b0ba0b771f0c91Christian König	alu_pop += pops;
27678813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (alu_pop == 1) {
27688813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
27698813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
27708813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else if (alu_pop == 2) {
27718813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
27728813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
27738813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else {
27748813842121d46d1be476807c98b0ba0b771f0c91Christian König		r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
27758813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
27768813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
27778813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
2778a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
278409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
278509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
279809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
280009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
280309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2809a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2810a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2811a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
28197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2849a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2852a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
288309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2885a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
28937ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
289709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
290009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2920a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2922a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2927a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2928a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2929a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2930a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2931a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2932a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2933a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2934a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2936a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2937a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2938a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2939a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2940a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2941a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2942a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2943a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2944a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2945a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2946a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2947a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2948a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2949a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2950a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2951a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2953a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
295409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
295809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
296109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2962a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
296309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2965a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
296609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
296709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
296809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
297109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
297209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
297309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
297409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2975a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
297609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
297709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
297809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
297909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
298009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
298109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
298209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
298309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
298409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
298509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
298609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
298709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
298809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
298909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
299009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
299109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
299209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
299309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
299409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
299509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
299609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
299709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
299809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
299909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
300009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
300109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
300209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
300309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
300409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
300509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
300609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
300709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
300809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
300909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
301109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
301209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
301309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
301409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
301609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
301709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
301909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
302009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
302109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3022a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3023a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3024a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
302698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
30280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3029df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3030df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3031df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3032df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3033df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3034df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3035df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
303642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
303736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3038460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3040de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3041cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3042cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
304357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3044dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3046d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3047be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3050b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30583af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30603af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
30634558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3064a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
30650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3070e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
307188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
30723af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
30733af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
30744502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30800d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30820d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
308388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3084d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
30850d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3087b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3089b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30969f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31000d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
310187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
310292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3103d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3106cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3107ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
310809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3109a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3113a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3114a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31230ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3156094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
318850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
318950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
319098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
319150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
319250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
319350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
319450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
319550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3196112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
319750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
319850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
319950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
320050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
320150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
320250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
320350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
320450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
320550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
320650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
320750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
320850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
320950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
321150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
321450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
321750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
321950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
322150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
322250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
322350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
322450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
322550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
322750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
322950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
323050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
323150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
323250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
323350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
324450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
32557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
32597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
32607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
32617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
32627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
32657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
32667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
32677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
32687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
32697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
32727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
32737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
32747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
32827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
32847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
32937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
32967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
32987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
33157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
33167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
33467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
33477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
33487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
33497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
33507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
33517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
33527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
33537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
33547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
33557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
33567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
33577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
33587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
33597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
33607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
33617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
33627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
33637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
33647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
33657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
33667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
33677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
33757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
33777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
33797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
33807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
33817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
33827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
33857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
33877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
33887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
33897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
33907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
33917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
33977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
33997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
34007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
34017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
34027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
34047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
34067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
340750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
340850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
340950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
341350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
341750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
341850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
341950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
342050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
342150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
342250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3423ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
342450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
342550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
342650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
342750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
342850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
342950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
343050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
343150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
343250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34390ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
344050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
344250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
345150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
345450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
345650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
345850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
346450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
347350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
347450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
347550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3504