r600_shader.c revision abe74a9820bc5b512ab24518622368db20187637
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;
18940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
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
13060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
13070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
13086a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
13096a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
13107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
13116a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
13127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
13137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
13147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = log(src.y) */
13157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
13167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
13177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 1);
13187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
13207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
13217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
13237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
13267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
13307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = log(src.y) */
13317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
13327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
13337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 1);
13342fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
13352fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
13362fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
13377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
13397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
13407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
13417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
13420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13436a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
13446a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
13450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
13470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1348a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
13491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 3);
13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
13510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1352ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
13531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[0], 0);
13540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
13550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
13560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
13570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
13580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
13677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
13707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
13757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
13777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
13817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
13827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
13837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
13847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
13857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
13867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
13907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
13917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
13920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1393abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1394abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
1395abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	memset(&alu, 0, sizeof(struct r600_bc_alu));
1396abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1397abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
1398abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1399abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1400abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1401abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
1402abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	r = r600_bc_add_alu(ctx->bc, &alu);
1403abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1404abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1405abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1406abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.x, <- 1.0  */
1407abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	memset(&alu, 0, sizeof(struct r600_bc_alu));
1408abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1409abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
1410abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1411abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
1412abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
1413abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	r = r600_bc_add_alu(ctx->bc, &alu);
1414abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1415abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1416abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1417abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
1418abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	memset(&alu, 0, sizeof(struct r600_bc_alu));
1419abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1420abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1421abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1422abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1423abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1424abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
1425abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	r = r600_bc_add_alu(ctx->bc, &alu);
1426abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1427abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1428abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
14290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
14300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
14310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
143242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
143342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
143442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
143542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
143642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
143742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
143842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1439df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1440df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1441df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1442df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1443df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1444df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1445df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
144642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
14471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[i], &ctx->src[i], 0);
144842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
144942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
145042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
145142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
145242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
145342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
145442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
145542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
145642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
145742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
145842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
145942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
14617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
14627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
14657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
14667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
14677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
14687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
14707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
147180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
14747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
14757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
14767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
14797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
14807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
14817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1482a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1485a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1486a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
14911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[i], &ctx->src[i], 0);
1492a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1496a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1497a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1498a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1499a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1500a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1502a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
15047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
15057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
15077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct r600_bc_alu alu;
15087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
15097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
15157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
15167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
15187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r600_bc_src(&alu.src[0], &ctx->src[1], 0);
15287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
15337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
15347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
15377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
15387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
15407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
15417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
15517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
15527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1553a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1555a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1557a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1558a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1560a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
15611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1567a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1568a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1569a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
157066f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
15711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[1], 0);
1572a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1574a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1575a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1576a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1580a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1581a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1582a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1586a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1587a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1588a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1589a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1590a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1591a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15920d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
15930d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
15940d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15950d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
1596921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
15970d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15980d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
15990d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1601a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16020d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1603cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
16040d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1605cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
16060d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
1608921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[0], i);
16100d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16120d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16150d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
16170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16180d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
16190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16200d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1621a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16220d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
162380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16240d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1626cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
16270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
16280d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1629921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16300d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
16310d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1633cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
16340d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16360d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16390d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
16410d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
16420d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
16430d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1652a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
16536c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1655a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
165680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1661cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1665cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1666cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1667cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1668cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1675dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
16777be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
16787be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
16797be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
16807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[j], &ctx->src[j], i);
1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
16867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
168780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
16917be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1702cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1710cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[j], &ctx->src[j], i);
1712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1713a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
171480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1715cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1716a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1718cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1721921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1723cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1727921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1728cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1729cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1730cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1731e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1732e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1733e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1734e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1735e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1736e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1737e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1738cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1739cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
17487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
17516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
17526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
17536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
17546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
17566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
17576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
17586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
17596415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
17606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
17616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
17626415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
17636415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17646415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
17656415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
17666415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
176733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
176833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
176996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
177033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
177133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1772641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1773641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
177440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1776da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
1777da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
17786415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
177978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
178013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
1781641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
17826415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
1783641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
178413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
178513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
178613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
178713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
178840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
178940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
179040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			memset(&tex, 0, sizeof(struct r600_bc_tex));
179140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
179240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
179340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
179440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
179540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
179640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
179740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
179840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
179940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
180040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
180140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
180240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
180340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
180440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					memset(&alu, 0, sizeof(struct r600_bc_alu));
180540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
180640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        r600_bc_src(&alu.src[0], &ctx->src[i], j);
180740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
180840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
180940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
181040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
181140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
181240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        r = r600_bc_add_alu(ctx->bc, &alu);
181340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
181440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
181540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
181613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
181740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
181840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
181940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
182040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
182140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
182240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
182340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
182440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
182540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
182640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
182740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
182840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
182940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
183040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
183140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
183240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
183340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			r = r600_bc_add_tex(ctx->bc, &tex);
183440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
183540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
183613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
183713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
18387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
1839b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
18407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
18417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
18427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
18437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
18447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
18457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 3);
1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
18477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
18487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
18497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
18507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
18527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
18547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
18597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
18607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
18617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
18627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 3);
18637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
18657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
18667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
18687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18729d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1875a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1876b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
18777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
18781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], i);
1879b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1880b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1881b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1882b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1883b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1884b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1885b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1886b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1887a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1888921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1889b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1890b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1891b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1892b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1893b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1894b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1895b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1896b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
189778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
1898b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
19020e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
19030e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1908a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
19090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
19100e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
19227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
19237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
19247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
19257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
19267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
19277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
19287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
19297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
19307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
19317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
19327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
19337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
19347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
19357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
19367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
19377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
19387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
19397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
19407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
19417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
19427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
19437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
19447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
19457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
19467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
19477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
19487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
19507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
19517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
19527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
19537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1955bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
19567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1959a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1961bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
19667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1969a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1980a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1982bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
19877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1989bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1990a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1991bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1992bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1999bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
200178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
2003bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2004bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
200578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
2006b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
2007b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
2008a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
20091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], i);
2010b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2011b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2012b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
2013b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
2014b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
2015b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
2016b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2017b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2018b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
201978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2020b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2021b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
20227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2023bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2024de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) {
2025de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
2026de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
2027de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
2028de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2029de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
2030de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
2031de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2032de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
2033de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
2034de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2035de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
2036de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
203733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
203833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
2039bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
20406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
20416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
2042077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
2043641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
20446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
20459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
20469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
20479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
20489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
204978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
205078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
205178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
205278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
205378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
205478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
205578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
205678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
205778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
205878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
2059244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
206078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
20619a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2063bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2064bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2065bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2066bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2067bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2068bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
206901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
207001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
207101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
20727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
207301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
207401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
2075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
207669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) {
207769d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
207878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = tex.src_sel_y;
207969d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY)
208069d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
208169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2082bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
208378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2084bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2085bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
2086bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2087bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2088bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2089bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2090bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
209133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
209233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2093b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2095b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2096b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
2097dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2098b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2100b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2101c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
21021fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2103c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2104c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2105c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2106c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2107c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			memset(&alu, 0, sizeof(struct r600_bc_alu));
2108c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
21091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[1], i);
21101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[2], i);
2111c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
211280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2113c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2114c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2115c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2116c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
2117c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			r = r600_bc_add_alu(ctx->bc, &alu);
2118c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2119c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2120c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2121c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2122c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2123c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2125dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2126dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2127dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2128dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2130a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2131921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2132b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
21331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[0], i);
2134b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
2135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2137dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2143b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2147dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2148dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2149dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2150dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2152a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2153b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2154b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
21551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[2], i);
2156b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2157b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2158dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2159b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2160b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2161b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2162b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2164b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2165b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2167b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2168dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2169dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2170dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2171dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
21751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
21761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[1], i);
2177b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2178b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2179dffad730df17983cfaef0808555a8c26cad0aa15Christian König
218080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2182dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2183b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2185b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2186b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2187b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2189dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2190b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2191b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
219287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
219387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
219487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
219587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
219687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2197dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
219887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
21997be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
22007be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
22017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
220287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
220387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2204a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
22051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], i);
22061fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[1], &ctx->src[2], i);
22071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[2], &ctx->src[1], i);
220880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
220987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
221087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
221187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
22127be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
221387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
221487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
221587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
221687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
22177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
221887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
221987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
222087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
22220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22240e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
22250e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
22260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
22270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
22280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
22290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2235a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
22360e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
22370e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
22380e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
22390e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
22400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
22410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
22420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
22470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
22580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2259a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
22600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22610e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
22620e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
22630e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
22640e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
22650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
22660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
22670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
22720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
22730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
22740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
22760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
227780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
227880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
22790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
22820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
22890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
22900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
22910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
22920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
229709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
22987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2304a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
23051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
230636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
231136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
231236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
231336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
231436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
23167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
23197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
232036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
23237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
23247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
23267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
23287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
23347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
23357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
23377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
23387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
23397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
23417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
23457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
234736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
234936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2350a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
23511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2354b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2355b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2356b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2357b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2358b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
235936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
236036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
236136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
236236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
236336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
236436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
236536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
236636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
236736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
236836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
236936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
237036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
23717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
23727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
23747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
237636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
23787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
23797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
23807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
23857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
23907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
23947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
23957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
23967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
24007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
240336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
240436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
240536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
240636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
240736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
240836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2409a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
241036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
241136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
241236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
241336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
241436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
241536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
241636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
241736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
241836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
241936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
242036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
242136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
242236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
242387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2424460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2425460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2426460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2427460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2428460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
24297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2430460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2431460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2432460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
24337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
24347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
24377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
24397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
24437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
24477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2450460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
24517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
24537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
24567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
248096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2482460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
248696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
248996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
24937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
24987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
25037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
25067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
25097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
25117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
25137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
251696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
251896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
252096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
252196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
252296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
252496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
252696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
252796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
252996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
253096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
253196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
25337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
25357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
25377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
25387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
25427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
254596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
25477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
25527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
25547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
255596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
25587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
256096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
25627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
256596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
25677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
25697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
25707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
25717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
25727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
25767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
25797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
25817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
25867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
25877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
25887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
258996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
25927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
259496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
25967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
259996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
260096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
260196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
260296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
260396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
260596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
260696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
260796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2609460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2611460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2612460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2613460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2615460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2616460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2617460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2618460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2619460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2620460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
26217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (ctx->bc->chiprev == CHIPREV_CAYMAN) {
26227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
2624460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
26267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2627460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
2634460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
26367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
26397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
26417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
26437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r600_bc_src(&alu.src[0], &ctx->src[0], 0);
26447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
26487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
26497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
26517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2654460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2661460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2662460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2663460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2664460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2665460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2666460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2669460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2670460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2671460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2672460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2673460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2674460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2675460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2676460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
267798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
267898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
267998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
268098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct r600_bc_alu alu;
268198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
2682a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
268398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
268498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
268552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
268652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
268752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
268852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
268952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
269052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
269152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
269252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
269352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
269452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
269552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
269652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
26971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
269898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2699077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.dst.sel = ctx->ar_reg;
270098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
2701495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
270298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
270398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
2704077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2705077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	/* TODO: Note that the MOVA can be avoided if we never use AR for
2706077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * indexing non-CB registers in the current ALU clause. Similarly, we
2707077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * need to load AR from ar_reg again if we started a new clause
2708077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * between ARL and AR usage. The easy way to do that is to remove
2709077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * the MOVA here, and load it for the first AR access after ar_reg
2710077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * has been modified in each clause. */
271198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
271298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2713077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
271498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
271598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2716495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
271798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
271898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
271998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
272098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
272198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
272247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
272347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
272447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
272547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
272647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
2727a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
27287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
27297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
2730077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2731077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
2732077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2733077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2734077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2735077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2736077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2737077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2738077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
2739077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2740077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2741077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2742077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
2743077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2744077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2745077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2746077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2747077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2748077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
27497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
27507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
2751077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2752077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2753077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2754077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2755077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2756077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2757077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2758077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if ((r = r600_bc_add_alu(ctx->bc, &alu)))
2759077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
27607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
27617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
27627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
27637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
27647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
27657ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2766077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&alu, 0, sizeof(alu));
2767077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2768077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
276947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
277047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2771495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
277247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
277347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2774c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
277547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
277647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
277747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
277857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
277957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
278057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
278157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
278257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
278357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
278457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
278557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
278657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
278880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
27897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
27907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
279157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
279257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
27931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[0], &ctx->src[0], i);
279457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
279557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2796a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
279757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
279857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
27991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_bc_src(&alu.src[1], &ctx->src[1], i);
280057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
280157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
280257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
280357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
280457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
280557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
280657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
280757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
280857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
280957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2810a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2813a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2815a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2818a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2819a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2820a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2821a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2822a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
28231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_bc_src(&alu.src[0], &ctx->src[0], 0);
2824a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2825a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
28267ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2827a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2828a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2829a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2830a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2831a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2832a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2833a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2834a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2835a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2836a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
28378813842121d46d1be476807c98b0ba0b771f0c91Christian König	int alu_pop = 3;
28388813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (ctx->bc->cf_last) {
28398813842121d46d1be476807c98b0ba0b771f0c91Christian König		if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
28408813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 0;
28418813842121d46d1be476807c98b0ba0b771f0c91Christian König		else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
28428813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 1;
28438813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
28448813842121d46d1be476807c98b0ba0b771f0c91Christian König	alu_pop += pops;
28458813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (alu_pop == 1) {
28468813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
28478813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
28488813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else if (alu_pop == 2) {
28498813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
28508813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
28518813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else {
28528813842121d46d1be476807c98b0ba0b771f0c91Christian König		r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
28538813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
28548813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
28558813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
2856a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2857a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2858a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2875a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
288009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
288309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
288509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2887a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2888a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2889a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
289309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
28977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
290009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2927a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2930a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
295409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
295609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2958a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
296109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
296209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2963a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
296409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
296509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
296609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
296709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
296809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
29717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
297209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
297309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
297409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
297509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
297609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
297709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
297809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
297909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
298009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
298109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
298209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
298309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
298409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
298509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
298609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
298709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
298809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
298909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
299009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
299109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
299209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
299309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
299409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
299509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
299609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
299709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2998a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
299909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
3000a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
300109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
300209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
300309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
300409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
3005a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3006a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3007a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3008a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
3009a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
3010a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
3011a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
3012a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
301309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
3014a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
3015a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3016a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3017a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3018a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
3019a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
3020a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
3021a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
3022a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
3023a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
3024a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
3025a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3026a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
3027a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
3028a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
3029a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
303009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
3031a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
303209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
303309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
303409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
303509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
303609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
303709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
303809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
303909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3040a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
304109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
304209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
3043a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
304409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
304509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
304609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
304709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
304809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
304909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
305009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
305109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
305209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
3053a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
305409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
305509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
305609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
305709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
305809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
305909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
306009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
306109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
306209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
306309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
306409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
306509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
306709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
306809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
307009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
307109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
307209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
307309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
307409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
307509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
307609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
307709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
307809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
307909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
308009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
308109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
308209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
308309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
308409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
308509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
308609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
308709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
308809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
308909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
309009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
309109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
309209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
309309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
309409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
309509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
309609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
309709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
309809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
309909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3100a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3101a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3102a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
310498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
31060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3107df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3108df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3109df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3110df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3111df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3112df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3113df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
311442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
311536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3116460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3119cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3120cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
312157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3122dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3124d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3125be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31363af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
31414558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3142a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
31430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3148e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
314988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
31503af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
31513af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
31524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31580d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31600d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
316188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3162d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
31630d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3165b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
316613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
3167b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31749f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31780d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
317987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
318092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3181d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3184cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3185ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
318609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3187a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3191a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3192a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32010ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3234094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
326898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
32728ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3274112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
327850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
327950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
328050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
328150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
328250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
328350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
328450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
328550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
328650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
328750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
328950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
329250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
329550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
329750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
329950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
330050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
330150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
330250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
330350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
330450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
330550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
330650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
330750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
330850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
330950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
331050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
331150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
331750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
331950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
332050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
332150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
332250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
332413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
332550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
332650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
33337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
33377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
33387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
33397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
33407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
33437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
33447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
33457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
33467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
33507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
33517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
33607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
33717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
33747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
33767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
33937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
33947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
33957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
34247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
34257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
34267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
34277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
34287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
34297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
34307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
34317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
34327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
34337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
34347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
34357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
34367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
34377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
34387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
34397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
34407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
34417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
34427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
34437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
34447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
34457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
34537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
34557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
34577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
34587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
34597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
34607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
34637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
34657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
34667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
34677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
34687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
34697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
34757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
34777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
34787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
34797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
34807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
348213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
34837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
34847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
348950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
349150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
349550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
349650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
349750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
349850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
349950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3501ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
350250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
350350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
350450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
350550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
350750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
350850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
350950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
351050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35170ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
351850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
351950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
352050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
352950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
353250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
353450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
353650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
354250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
355150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
355250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
355350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
357950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
358050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
358150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3582