r600_shader.c revision 13c9a8552bc83b1ad91442caacf847cb6cead2b5
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
661235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (int i = 0; i < vs->noutput; i++) {
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (input->name == vs->output[i].name &&
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse			input->sid == vs->output[i].sid) {
691235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return i - 1;
701235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
731235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
741235becaa1cf7e29f580900592563c3329d326deJerome Glisse
75a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
761235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
771235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
781235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
79843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	uint32_t *ptr;
80843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	int	i;
811235becaa1cf7e29f580900592563c3329d326deJerome Glisse
821235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
842f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich		/* use PIPE_BIND_VERTEX_BUFFER so we use the cache buffer manager */
852f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_IMMUTABLE);
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
871235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
881235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
89843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		ptr = (uint32_t*)r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
90d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		if (R600_BIG_ENDIAN) {
91d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			for (i = 0; i < rshader->bc.ndw; ++i) {
92d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
93d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			}
94d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		} else {
95d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
96843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		}
97294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
991235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
1171235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1213b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
1223b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
123dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
125052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse
129c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
130c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
131c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
132c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
133052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
134052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
135052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
136052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		tgsi_dump(tokens, 0);
137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse	shader->shader.family = r600_get_family(rctx->radeon);
1393b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	r = r600_shader_from_tgsi(tokens, &shader->shader);
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_bc_build(&shader->shader.bc);
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
149052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
150052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		r600_bc_dump(&shader->shader.bc);
151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
152052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
153afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15669251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
157ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
158ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
159ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
160ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	r600_bo_reference(rctx->radeon, &shader->bo, NULL);
161f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck	r600_bc_clear(&shader->shader.bc);
162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
163ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1682b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
177a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
185077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned				ar_reg;
1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
1872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
1882b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
1891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	struct r600_shader_src			src[3];
190cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
191cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
192e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
196fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
197fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
20842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
222c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
223a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
228a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2318260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2328260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
23847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
245fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
24650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
24750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
24850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
271fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
282fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
30050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
3017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
30572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
30896bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
30972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
31535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
3168a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
3187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev >= CHIPREV_EVERGREEN) {
31950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
320fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
321fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
322fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
323fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
324fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
325fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
32650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
33335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
33733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
33847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
34096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
341c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
342c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
343c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			struct r600_bc_alu alu;
344c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			memset(&alu, 0, sizeof(struct r600_bc_alu));
34596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
346c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
347c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
348c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
34996bbc627f369c0100b950f81531b1fe9ef586c34Christian König
35096bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
35196bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
35296bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
353c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
35496bbc627f369c0100b950f81531b1fe9ef586c34Christian König
355c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			if ((r = r600_bc_add_alu(ctx->bc, &alu)))
356c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
357c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
358c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		}
35996bbc627f369c0100b950f81531b1fe9ef586c34Christian König
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
36572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
36672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
367be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
368be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
369be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
370be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
371be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
3727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
373fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
374fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
375fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
376fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
377fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
379fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
380fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
381fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
382fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
384fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
385fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
387fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
388fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
389fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
390fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
395fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
396fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
397fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
398fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
399fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
400fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
401fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
404fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
405fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
406fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
408fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
409fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
410fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
411fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
413fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
414fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
4191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
4201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
4211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
4221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
4231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
4241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
4251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
4261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
4271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
4281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
4291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
43096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
4311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
4321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
4331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
4341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
4351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
4361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
4371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
4381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
4391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
4401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
4411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
4421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
4431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
4441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
44596bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
446c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		/* assume we wan't TGSI_SEMANTIC_INSTANCEID here */
447c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[0] = 3;
448c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[1] = 3;
449c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[2] = 3;
450c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[3] = 3;
451c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->sel = 0;
452c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
4531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
4541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
4551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
4561fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
4571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
4581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
4591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
460077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
461077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
462077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	struct r600_bc_vtx vtx;
463077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
464077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
465077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
466077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
467077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		struct r600_bc_alu alu;
468077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
469077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
470077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
471077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
472077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
473077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
474077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
475077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
476077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
477077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
478077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
479077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
480077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
481077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
482077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
483077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
484077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
485077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
486077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = ctx->ar_reg;
487077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
488077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
489077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
490077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
491077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
492077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
493077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
494077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
495077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
496077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
497077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
498077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
499077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
500077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
501077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
502d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
503077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
504077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if ((r = r600_bc_add_vtx(ctx->bc, &vtx)))
505077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
506077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
507077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
508077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
509077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5107687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
5117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
5127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct r600_bc_alu alu;
5147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
5157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
5177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
5187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
5197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
5217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
523077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
524077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
525077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
526077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
527077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
528077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
529077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
530077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
531077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
532077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
533077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
534077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
535077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
5367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
5377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
5387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				memset(&alu, 0, sizeof(struct r600_bc_alu));
5397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
5407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
5417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
5427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
5437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
5447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
5457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
5467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
5477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
5487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				r = r600_bc_add_alu(ctx->bc, &alu);
5497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
5507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
5517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
5527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
5537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
5547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
5557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
5587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
5597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
5617687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
5627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
5637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct r600_bc_alu alu;
5657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
5667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
5687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
5697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
5707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
5737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
5747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
5757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
5767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				memset(&alu, 0, sizeof(struct r600_bc_alu));
5777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
5787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
5797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
5807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
5817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
5827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
5837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
5847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
5857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
5867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				r = r600_bc_add_alu(ctx->bc, &alu);
5877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
5887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
5897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
5907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
5917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
5927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
5967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5973b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
59872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
6005555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
602c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
603457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
60672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
617f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
620076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
621076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
622076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
623f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
624f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
625f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
627076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
628076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
629076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
630076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
6457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx.bc->chiprev >= CHIPREV_EVERGREEN) {
646f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
647f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
648f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
649f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
6517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev >= CHIPREV_EVERGREEN) {
652fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
65384457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
658d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
65997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
66097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
66197e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
662d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
6637728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
664077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	ctx.ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
666077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	ctx.temp_reg = ctx.ar_reg + 1;
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
668cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
669cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
6705555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
676cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
677cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
678cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
679cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
680cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
681cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
682cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
683cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
684cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
685cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
696be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
697be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
698be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
6991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
7007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
7017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
7027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
7037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
7047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
7057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (ctx.bc->chiprev == CHIPREV_CAYMAN)
7067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
7077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			else if (ctx.bc->chiprev >= CHIPREV_EVERGREEN)
70850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
70950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
71050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
715876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
7165555cd776b970bce020be59193054474a2a63317Dave Airlie			property = &ctx.parse.FullToken.FullProperty;
7175555cd776b970bce020be59193054474a2a63317Dave Airlie			if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
7185555cd776b970bce020be59193054474a2a63317Dave Airlie				if (property->u[0].Data == 1)
7195555cd776b970bce020be59193054474a2a63317Dave Airlie					shader->fs_write_all = TRUE;
7205555cd776b970bce020be59193054474a2a63317Dave Airlie			}
721876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
729457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
730457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
731c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
732c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
733c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
734c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
735c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
736c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
737c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
7388ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[i].burst_count = 1;
739c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
740c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
741c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
742a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
743457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
746c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
747c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
749457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
750457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
751457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
752457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
753457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
754457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
755457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
760b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
761c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
7625f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
763c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
764b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
76539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
76639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
76739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
76839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
76939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
77039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
77139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
77239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
773c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
78472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
785457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
786457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
787457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
788457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
789457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
790457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
791457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
792457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
795457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
796457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
797457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
798457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
799457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
800457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
801457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
8028ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
803457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
804457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
805457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
8067e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
807457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
809c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
810481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
811481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
812481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
813481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
814481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
815481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
816481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
817481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
818481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
8198ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
820481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
821608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
822481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
823a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
824481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
825481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
826457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
827457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
8287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx.bc->chiprev < CHIPREV_CAYMAN) {
8297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
8307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
8317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
832457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
833b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
834b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
835a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
836c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
837c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
838457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
839457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
840c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
8447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
8457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (ctx.bc->chiprev == CHIPREV_CAYMAN)
8467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		cm_bc_add_cf_end(ctx.bc);
8477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
8483b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
852cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
859f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
860f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
869a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic void r600_bc_src(struct r600_bc_alu_src *bc_src,
870a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
871a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
872a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
873a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
874a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
875a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
876a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
877a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
878a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
879a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
880a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
88180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
88280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
88380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
88480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     struct r600_bc_alu_dst *r600_dst)
885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
8867a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8877a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
89247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
89347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
8947a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
8957a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
8967a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
899dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
901dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
902d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
903d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
904dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
905d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
906d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
907d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
908dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
909dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
910dffad730df17983cfaef0808555a8c26cad0aa15Christian König
911dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
912dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
913dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
914dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct r600_bc_alu alu;
915dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
916dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
918d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
919d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
920d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
921d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
92380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
925d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
926d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				r600_bc_src(&alu.src[j], &ctx->src[j], i);
929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
930d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
9311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[1], i);
9321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], i);
933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
936de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
9397a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
9407a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
9416372660d122f4056dffb56d1b93dbd1bbc661f67Dave Airlie			if (alu.src[0].neg)
9426372660d122f4056dffb56d1b93dbd1bbc661f67Dave Airlie			  alu.src[0].neg = 0;
9437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
947d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
957d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
958d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
959d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
960d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
961d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
962d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
963d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
964d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
965d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
966d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
9677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
9687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
9697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
9717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct r600_bc_alu alu;
9727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
9737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
9757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
9767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
9777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[j], &ctx->src[j], 0);
9797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
9807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
9827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
9847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
9857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
9867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
9877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
9887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
9897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
9907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
9917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
99388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
99488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
99588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
9971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
99996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
100096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
100196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
100296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
100396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
100492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
10057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
100888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
101088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
101388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
10141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
10157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1016921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1018a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
101996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1020ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1027a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
10287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1041a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
104988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
10507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1051921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1053921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1054ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
105596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
105696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	if (ctx->bc->chiprev == CHIPREV_R600) {
1057a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1058a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
105996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
106096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
106196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
106296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
106396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
106496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
106688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
106888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
106992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
10727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
10737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
10747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct r600_bc_alu alu;
10767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
10777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
10787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
10807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
10817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
10827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
10857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
10867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
10877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
10887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
10917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
10937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
10947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
10957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
10967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
10977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
10987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
10997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
11007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
11017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
11027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
110392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
110492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
110592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
110692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
110792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1108dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
110992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
11101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
111192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
111292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
112188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
112588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
112688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
112788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1128be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1129be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1130be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1131be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
113288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1133a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1134be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1135be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
113680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1137be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
113888f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
113988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
114088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
114188f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
114288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
114388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
114488f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
114588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
114692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
114792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
114892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
114992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
11507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
115192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
115357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
115457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
115557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
11561fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
115757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
115857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
115957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
116092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
116192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
116257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
11637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
11647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
11657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
11667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
11677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
11707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
11717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
11727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
11737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
11747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
11757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
11767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
11777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
11787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
11797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
11807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
11817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
11827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
11837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
11847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
11867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
11877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
11887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
11897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
11907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
11917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
11927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
119357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
119492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
119592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
119657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
11977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
11987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
11997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
12007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
12017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
12037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
12047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
12057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
12067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
12077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
12087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
12097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
12107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
12117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
12127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
12137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
12147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
12157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
12167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
12177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
121857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
12197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
12207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
12217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
12227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
12237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
12247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
12257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
122657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
122792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1228ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1229ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1230ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1231ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1232ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1233ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
123480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1235ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1236ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1237ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1238ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1239ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1240ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1241ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1242ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1243ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1244ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1245ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1246ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1247ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1248ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1249ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1250ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1251ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
125280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1253ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1254ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1255ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1256ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1257ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1258ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1259ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1260ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1261ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1262ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1263ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
126492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
126592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
126692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1267094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1268094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1269094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1270094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1271094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1272094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1273094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1274094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
12754502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1276094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
12774502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1278921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
12794502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12804502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
12814502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
12824502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
12834502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
12841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], i);
12854502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1286094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1287094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1288094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1289094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1290094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1291094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1292094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
12934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
12954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
12964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1297094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1298094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1299094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
13020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
13050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
13077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1308a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1309921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
13107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
131180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
13127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
13137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
13187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1319a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
13201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
1321921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
132285e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
132380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
13247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
13257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
13307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1331a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1332921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
13337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
133480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
13357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
13367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
13377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
13420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
13436a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
13446a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
13457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
13466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
13477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
13487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = log(src.y) */
13507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 1);
13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
13557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
13567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
13587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
13617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = log(src.y) */
13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
13677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 1);
13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
13747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
13750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13766a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
13776a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
13780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
13800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1381a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
13821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 3);
13830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
13840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1385ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
13861fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[0], 0);
13870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
13880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
13890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
13900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
13910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
13977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
13987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
13997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
14027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
14037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
14057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
14067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
14077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
14087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
14097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
14107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
14117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
14127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
14137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
14147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
14157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
14167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
14187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
14197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
14207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
14227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
14250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
14260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
14270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
14280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
142942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
143042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
143142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
143242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
143342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
143442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
143542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1436df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1437df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1438df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1439df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1440df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1441df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1442df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
144342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
14441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[i], &ctx->src[i], 0);
144542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
144642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
144742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
144842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
144942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
145042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
145142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
145242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
145342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
145442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
145542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
145642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1457a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
14587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
14597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
14627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
14637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
14647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
14657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1466a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
14677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
146880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
14717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
14727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
14737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
14767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
14777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
14787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1480a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1481a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1482a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1485a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1486a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
14881fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[i], &ctx->src[i], 0);
1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1491a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1492a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1496a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1497a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1498a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1499a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
15017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
15027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
15047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct r600_bc_alu alu;
15057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
15067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
15087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
15127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
15157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
15227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r600_bc_src(&alu.src[0], &ctx->src[1], 0);
15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
15287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
15347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
15377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
15387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
15427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
15487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
15497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1550a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1551a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1552a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1553a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1555a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1557a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
15581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1560a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1561a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
156766f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
15681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[1], 0);
1569a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1570a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1571a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1572a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1574a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1575a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1576a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1578a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1580a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1581a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1582a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1586a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1587a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1588a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15890d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
15900d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
15910d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15920d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
1593921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
15940d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15950d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
15960d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
15970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1598a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
15990d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1600cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
16010d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1602cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
16030d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
1605921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16061fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[0], i);
16070d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16080d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16090d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16100d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16120d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16130d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
16140d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16150d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
16160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16170d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1618a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16190d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
162080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16210d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16220d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1623cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
16240d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
16250d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1626921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
16280d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16290d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1630cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
16310d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16330d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16340d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16360d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
16390d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1642cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1649a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
16506c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1652a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
165380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1661cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1665cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1666cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1672dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
16747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
16757be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
16767be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
16777be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[j], &ctx->src[j], i);
1682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
16837be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
168480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
16887be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16957be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1697cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1702cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1707cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17081fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[j], &ctx->src[j], i);
1709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1710a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
171180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1713a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1714cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1715cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1716cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1718921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1721cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1723cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1724921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1727cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1728e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1729e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1730e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1731e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1732e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1733e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1734e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1735cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1736cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
17457be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
174833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
174933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
175096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
175133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
175233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1753641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1754641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1755b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1757da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
1758da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
175978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	const boolean src_requires_loading =
1760da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler		(inst->Src[0].Register.File != TGSI_FILE_TEMPORARY &&
1761da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler		inst->Src[0].Register.File != TGSI_FILE_INPUT) ||
1762da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler		ctx->src[0].neg || ctx->src[0].abs;
176378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
176413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
1765641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1766641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1767641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
176813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
176913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
177013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
177113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
177213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* set gradients h/v */
177313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		memset(&tex, 0, sizeof(struct r600_bc_tex));
177413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.inst = SQ_TEX_INST_SET_GRADIENTS_H;
177513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.sampler_id = ctx->file_offset[inst->Src[sampler_src_reg].Register.File] + inst->Src[sampler_src_reg].Register.Index;
177613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
177713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_gpr = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
177813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_x = ctx->src[1].swizzle[0];
177913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_y = ctx->src[1].swizzle[1];
178013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_z = ctx->src[1].swizzle[2];
178113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_w = ctx->src[1].swizzle[3];
178213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_rel = ctx->src[1].rel;
178313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
178413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
178513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
178613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_x = 1;
178713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_y = 1;
178813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_z = 1;
178913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_w = 1;
179013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
179113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		r = r600_bc_add_tex(ctx->bc, &tex);
179213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		if (r)
179313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			return r;
179413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
179513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* set gradients h/v */
179613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		memset(&tex, 0, sizeof(struct r600_bc_tex));
179713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.inst = SQ_TEX_INST_SET_GRADIENTS_V;
179813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.sampler_id = ctx->file_offset[inst->Src[sampler_src_reg].Register.File] + inst->Src[sampler_src_reg].Register.Index;
179913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
180013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_gpr = ctx->file_offset[inst->Src[2].Register.File] + inst->Src[2].Register.Index;
180113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_x = ctx->src[2].swizzle[0];
180213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_y = ctx->src[2].swizzle[1];
180313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_z = ctx->src[2].swizzle[2];
180413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_sel_w = ctx->src[2].swizzle[3];
180513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.src_rel = ctx->src[2].rel;
180613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
180713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
180813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
180913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_x = 1;
181013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_y = 1;
181113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_z = 1;
181213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			tex.coord_type_w = 1;
181313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
181413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		r = r600_bc_add_tex(ctx->bc, &tex);
181513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		if (r)
181613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie			return r;
181713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
18187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
1819b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
18207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
18217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
18227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
18237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
18247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
18257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 3);
1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
18277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
18287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
18297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
18307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
18327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
18347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
18397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
18407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
18417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
18427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 3);
18437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
18457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
18467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
18487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
18497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
18507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
18517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18529d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1853b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1854b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1855a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1856b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
18577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
18581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], i);
1859b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1860b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1861b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1862b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1863b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1864b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1867a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1868921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1875b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1876b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
187778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
1878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1880bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1881bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
18820e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
18830e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
1884bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1885bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1888a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
18890e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
18900e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
19027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
19037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
19047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
19057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
19067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
19077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
19087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
19097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
19107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
19117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
19127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
19137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
19147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
19157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
19167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
19177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
19187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
19197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
19207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
19217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
19227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
19237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
19247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
19257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
19267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
19277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
19287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
19307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
19317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
19327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
19337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1934bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
19367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1938bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1939a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1942bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1944bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1945bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
19467ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1949a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1952bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1955bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1960a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1961bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1966bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
19677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1970a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
198178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
1982bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
198578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
1986b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1987b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1988a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
19891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], i);
1990b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1991b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1992b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1993b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1994b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1995b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1996b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1997b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1998b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
199978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2000b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2001b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
20027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2003bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2004bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
2005bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
2006bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
200733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
200833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
2009bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
201013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
201113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[sampler_src_reg].Register.File] + inst->Src[sampler_src_reg].Register.Index;
2012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
2013641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
20146c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
20159d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
20169d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
20179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
20189d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
201978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
202078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
202178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
202278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
202378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
202478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
202578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
202678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
202778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
202878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
2029244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
203078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
20319a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2032bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2033bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2034bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2035bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2036bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2037bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2038bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
203901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
204001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
204101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
20427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
204301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
204401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
2045bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
204669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) {
204769d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
204878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = tex.src_sel_y;
204969d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY)
205069d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
205169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2052bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
205378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2054bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2055bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
2056bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2057bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2058bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2059bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2060bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
206133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
206233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2063b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2064b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2065b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2066b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
2067dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2068b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2069b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2070b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2071c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
20721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2073c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2074c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2075c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2076c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2077c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			memset(&alu, 0, sizeof(struct r600_bc_alu));
2078c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
20791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[1], i);
20801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[2], i);
2081c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
208280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2083c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2084c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2085c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2086c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
2087c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			r = r600_bc_add_alu(ctx->bc, &alu);
2088c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2089c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2090c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2091c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2092c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2093c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2095dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2096dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2097dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2098dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2100a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2101921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2102b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
21031fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[0], i);
2104b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
2105b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2106b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2107dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2108b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2109b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2110b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2111b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2112b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2113b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2114b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2115b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2116b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2117dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2118dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2119dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2120dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2121b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2122a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2123b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
21251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[2], i);
2126b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2127b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2128dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2131b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2132b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2133b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2134b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2138dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2139dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2140dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2141dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2143a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
21451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
21461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[1], i);
2147b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2149dffad730df17983cfaef0808555a8c26cad0aa15Christian König
215080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2152dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2153b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2154b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2155b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2156b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2157b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2158b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2159dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2160b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2161b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
216287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
216387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
216487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
216587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
216687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2167dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
216887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
21697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
21707be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
21717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
217287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
217387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2174a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
21751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
21761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[2], i);
21771fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[1], i);
217880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
217987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
218087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
218187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
21827be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
218387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
218487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
218587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
218687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
21877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
218887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
218987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
219087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21940e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
21950e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
21990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2205a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
22060e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
22070e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
22080e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
22090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
22170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
22280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2229a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22310e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
22320e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
22330e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
22340e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
22350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
22360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
22370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
22420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
22430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
22440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
22460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
224780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
224880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
22490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
22520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
22590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
22600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
22610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
22620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
226336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
226436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
226536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
226636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
226709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
22687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
226936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2274a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
22751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
227636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
227736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
227836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
227936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
228036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
228236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
228436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
22857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
22867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
22897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
22917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
22927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
22937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
22947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
22967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
22987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
23047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
23057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
23077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
23087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
23097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
23117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
231436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
23157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
231636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
231736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
231836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
231936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2320a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
23211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
232236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
232336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2324b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2325b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2326b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2327b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2328b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
232936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
233036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
233136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
233236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
233336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
233436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
233536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
233836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
233936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
23417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
23427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
23447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
23487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
23497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
23507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
23557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
23607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
236236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
23647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
23657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
23667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
23707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
237336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
237436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
237536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
237636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
237736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
237836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2379a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
238036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
238136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
238236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
238436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
238536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
238636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
238736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
238836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
238936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
239036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
239136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
239387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2394460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2395460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2396460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2397460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2398460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
23997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2400460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2401460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2402460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
24037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
24047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
2406460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
24077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
24097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
24137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
24177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2420460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
24217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
24237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
24267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
24297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
24327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2435460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2437460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2438460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2439460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2440460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2441460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2442460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2443460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2444460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2445460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2446460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2447460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2448460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2449460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
245096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
24537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
245696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
245996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
24737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
248696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
248896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
249096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
249196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
249296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
249396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
249496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
249596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
249696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
249796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
249896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
249996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
250096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
250196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
25037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
25057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
25077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
25087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
25127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
251596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
25177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
25227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
25247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
25287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
253096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
25327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
253596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
25377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
25397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
25407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
25417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
25427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
25467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
25497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
25517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
25567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
25577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
25587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
255996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
25627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
256496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
25667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
256996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
257096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
257196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
257296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
257396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25741fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
257596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
257696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
257796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2578460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2579460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2580460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2581460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2582460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2583460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2584460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2585460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2586460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2587460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2588460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2589460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2590460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
25917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
25927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
2594460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2597460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
2604460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
26067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
26097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
26117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
26137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
26147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
26187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
26197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
26217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2624460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2625460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2626460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2627460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2628460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2629460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2630460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2631460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2632460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2633460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2634460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2635460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2636460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2637460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2638460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2639460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2640460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2641460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2642460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2643460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2644460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2645460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2646460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
264798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
264898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
264998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
265098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct r600_bc_alu alu;
265198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
2652a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
265398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
265498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
265552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
265652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
265752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
265852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
265952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
266052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
266152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
266252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
266352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
266452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
266552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
266652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
26671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
266898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2669077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.dst.sel = ctx->ar_reg;
267098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
2671495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
267298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
267398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
2674077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2675077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	/* TODO: Note that the MOVA can be avoided if we never use AR for
2676077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * indexing non-CB registers in the current ALU clause. Similarly, we
2677077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * need to load AR from ar_reg again if we started a new clause
2678077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * between ARL and AR usage. The easy way to do that is to remove
2679077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * the MOVA here, and load it for the first AR access after ar_reg
2680077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * has been modified in each clause. */
268198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
268298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2683077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
268498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
268598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2686495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
268798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
268898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
268998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
269098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
269198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
269247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
269347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
269447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
269547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
269647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
2697a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
26987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
26997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
2700077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2701077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
2702077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2703077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2704077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2705077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2706077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2707077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2708077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
2709077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2710077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2711077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2712077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
2713077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2714077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2715077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2716077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2717077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2718077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
27197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
27207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
2721077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2722077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2723077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2724077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2725077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2726077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2727077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2728077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2729077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
27307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
27317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
27327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
27337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
27347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
27357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2736077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&alu, 0, sizeof(alu));
2737077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2738077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
273947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
274047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2741495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
274247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
274347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2744c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
274547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
274647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
274747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
274857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
274957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
275057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
275157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
275257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
275357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
275457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
275557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
275657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2757a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
275880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
27597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
27607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
276157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
276257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
27631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], i);
276457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
276557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2766a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
276757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
276857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
27691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], i);
277057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
277157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
277257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
277357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
277457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
277557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
277657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
277757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
277857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
277957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2788a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2790a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2791a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2792a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
27931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2794a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2795a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
27967ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2799a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
28078813842121d46d1be476807c98b0ba0b771f0c91Christian König	int alu_pop = 3;
28088813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (ctx->bc->cf_last) {
28098813842121d46d1be476807c98b0ba0b771f0c91Christian König		if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
28108813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 0;
28118813842121d46d1be476807c98b0ba0b771f0c91Christian König		else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
28128813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 1;
28138813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
28148813842121d46d1be476807c98b0ba0b771f0c91Christian König	alu_pop += pops;
28158813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (alu_pop == 1) {
28168813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
28178813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
28188813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else if (alu_pop == 2) {
28198813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
28208813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
28218813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else {
28228813842121d46d1be476807c98b0ba0b771f0c91Christian König		r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
28238813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
28248813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
28258813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
2826a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2827a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2828a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2830a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2845a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2857a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2858a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2859a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
28677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
288009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
288309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
288509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
289309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2897a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2900a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
292709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2928a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
293009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2933a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
29417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
295409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
295609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
295809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
296109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
296309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
296409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
296509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
296709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2968a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2970a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
297109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
297209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
297309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
297409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2975a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2976a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2977a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2978a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2979a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2980a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2981a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2982a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
298309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2984a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2985a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2986a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2987a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2988a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2989a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2990a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2991a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2992a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2993a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2994a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2995a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2996a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2997a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2998a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2999a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
300009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
3001a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
300209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
300309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
300409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
300509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
300609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
300709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
300809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
300909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3010a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
301109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
3013a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
301409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
301509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
301609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
301709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
301809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
302009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
302109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
302209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
3023a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
302409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
302509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
302609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
302709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
302809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
302909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
303009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
303109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
303209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
303309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
303409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
303509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
303609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
303709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
303809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
303909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
304009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
304109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
304209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
304309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
304409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
304509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
304609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
304709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
304809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
304909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
305009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
305109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
305209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
305309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
305409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
305509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
305609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
305709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
305809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
305909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
306009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
306109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
306209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
306309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
306409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
306509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
306709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
306809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3070a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3071a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3072a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
307498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
30760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3077df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3078df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3079df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3080df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3081df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3082df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3083df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
308442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
308536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3086460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3089cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3090cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
309157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3092dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3094d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3095be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3098b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31063af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31083af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
31114558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3112a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
31130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31167a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3118e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
311988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
31203af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
31213af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
31224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31280d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31300d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
313188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3132d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
31330d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3135b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
313613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
3137b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31449f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31480d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
314987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
315092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3151d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3154cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3155ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
315609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3157a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3161a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3162a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31710ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3204094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
323898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3244112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
324950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
325050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
325150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
325250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
325350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
325450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
325550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
325650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
325750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
325950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
326250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
326550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
327250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
327850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
327950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
328050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
328150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
328750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
328950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
329050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
329150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
329250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
329413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
329550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
329650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
33037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
33077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
33087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
33097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
33107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
33137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
33147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
33157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
33167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
33207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
33217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
33307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
33417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
33447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
33467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
33637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
33647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
33947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
33957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
33967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
33977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
33987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
33997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
34007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
34017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
34027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
34037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
34047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
34057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
34067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
34077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
34087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
34097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
34107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
34117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
34127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
34137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
34147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
34157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
34237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
34257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
34277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
34287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
34297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
34307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
34337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
34357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
34367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
34377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
34387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
34397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
34457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
34477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
34487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
34497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
34507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
345213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
34537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
34547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
345950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
346150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
346550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
346650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
346750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
346850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
346950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3471ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
347250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
347350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
347450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
347550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
347750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
347850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
347950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
348050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34870ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
348850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
349050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
349950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
350250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
350450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
350650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
351250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
352150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
352250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
352350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3552