r600_shader.c revision 39491d1d31d9f03437816fbb4f2872761ae1157c
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
60a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
611235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
621235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
64843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	uint32_t *ptr;
65843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	int	i;
661235becaa1cf7e29f580900592563c3329d326deJerome Glisse
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
696101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		shader->bo = (struct r600_resource*)
706101b6d442b06a347c001fe85848d636ab7df260Marek Olšák			pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4);
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
731235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
746101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->buf, rctx->ctx.cs, PIPE_TRANSFER_WRITE);
75d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		if (R600_BIG_ENDIAN) {
76d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			for (i = 0; i < rshader->bc.ndw; ++i) {
77d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
78d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			}
79d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		} else {
80d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
81843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		}
826101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		rctx->ws->buffer_unmap(shader->bo->buf);
831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
841235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
851235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
874f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
881235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
891235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
901235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
911235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
921235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
931235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
944f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
951235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
961235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
971235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
991235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse
106eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader);
1073b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
108eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
110052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse
114c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
118052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
121eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		tgsi_dump(shader->tokens, 0);
122543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
123543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		if (shader->so.num_outputs) {
124543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			unsigned i;
125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			fprintf(stderr, "STREAMOUT\n");
126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			for (i = 0; i < shader->so.num_outputs; i++) {
1272449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				unsigned mask = ((1 << shader->so.output[i].num_components) - 1) <<
1282449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák						shader->so.output[i].start_component;
129543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				fprintf(stderr, "  %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i,
130543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					shader->so.output[i].output_buffer, shader->so.output[i].register_index,
1312449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        mask & 1 ? "x" : "_",
1322449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 1) & 1 ? "y" : "_",
1332449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 2) & 1 ? "z" : "_",
1342449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 3) & 1 ? "w" : "_");
135543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
136543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
138eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	r = r600_shader_from_tgsi(rctx, shader);
1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1434a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_build(&shader->shader.bc);
1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
148052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
1494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_dump(&shader->shader.bc);
150052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
152afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15569251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
156ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
1576101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
1584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_clear(&shader->shader.bc);
159eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
160eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	memset(&shader->shader,0,sizeof(struct r600_shader));
161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
1854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode				*bc;
1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
18740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
188cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
189cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
190e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
1962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
1972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
20642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
220c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
221a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2288260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2298260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
23547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
23647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
243fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
24450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
24550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
2464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
247fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
268fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
27050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
2724a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
280fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
285fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
286fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
29050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
2944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
2997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
30121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
30221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0;
31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
31221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
31321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
31521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
31721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
31821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
32021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
32121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
32221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
32321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
32421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
32521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
32621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
3277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3280a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
3290a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
3300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3310a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
3450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
3480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
3490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
3500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
3520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
3530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
3540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
3550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
3560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
3570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
3580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
3605b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3615b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
3635b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* FIXME: two-side rendering is broken in r600g, this will
3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			 * keep old functionality */
3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			if (name == TGSI_SEMANTIC_BCOLOR)
3835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin				name = TGSI_SEMANTIC_COLOR;
3845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
3865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
3875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
3885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
3905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
3915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
3925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
3935b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
3945b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3955b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
3965b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
3975b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
39972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
40296bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
40372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
4095b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
41035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4118a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
412024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
41389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) {
41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
4155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			if (ctx->shader->input[i].spi_sid) {
41621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie				ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
41921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie				} else {
42021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie					evergreen_interp_flat(ctx, i);
421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
422fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
42350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
4295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
430024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
43135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
43533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
43647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
43896bbc627f369c0100b950f81531b1fe9ef586c34Christian König
439c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
440c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
4414a47662beaa2092447939db7880531fb706afeddMarek Olšák			struct r600_bytecode_alu alu;
4424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44396bbc627f369c0100b950f81531b1fe9ef586c34Christian König
444c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
445c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
446c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
44796bbc627f369c0100b950f81531b1fe9ef586c34Christian König
44896bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
44996bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
45096bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
451c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
45296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
4534a47662beaa2092447939db7880531fb706afeddMarek Olšák			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
454c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
455c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
45639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
45739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
46372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
46472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
465be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
466be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
467be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
468be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
469be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
4707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
502fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
503fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
504fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
505fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
506fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
507fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
508fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
509fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
510fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
511fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
512fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
513fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
514fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
515fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
516fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
5171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
5181fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
5191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
5201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
5211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
5221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
5231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
5241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
5251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
5261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
5271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
52896bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
5301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
5311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
5321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
5331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
5341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
5351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
5364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
5371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
5381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
5391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
5401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
5411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
5421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
54396bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
54439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
54539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
54639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
54739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
54839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
54939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
55039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
55139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
55239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
55339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
55439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
55539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
55639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
557c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
5581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
5591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
5601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
5611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
5621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
5631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
5641fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
565077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
566077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
5674a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
568077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
569077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
570077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
571077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
5724a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
573077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
574077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
575077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
576077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
578077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
579077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
580077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
581077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
582077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
583077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
584077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
585077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5864a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
587077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
588077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
589077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
590077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
5918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
592077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
593077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
594077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
595077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
596077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
597077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
598077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
599077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
600077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
601077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
602077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
603077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
604077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
605077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
606077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
607d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
608077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6094a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
610077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
611077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
612077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
613077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
614077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6157687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
6167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
6177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6184a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
6197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
6207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
6247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
6267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
628077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
629077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
630077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
633077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
634077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
635077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
636077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
637077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
638077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
639077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
640077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
6417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
6427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
6434a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
6447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
6457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
6467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
6477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
6487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
6497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
6507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
6517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
6527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
6534a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
6547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
6557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
6567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
6577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
6587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
6597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
6607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
6637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
6647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
6667687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
6677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
6687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6694a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
6707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
6717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
6737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
6747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
6757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
6807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
6814a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
6827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
6837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
6847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
6857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
6867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
6877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
6887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
6897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
6907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
6914a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
6927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
6937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
6947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
6957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
6967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
6977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
7007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
7017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
702eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader)
70372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
704eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
705eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct tgsi_token *tokens = pipeshader->tokens;
706543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	struct pipe_stream_output_info so = pipeshader->so;
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
7085555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
7104a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
711457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
713feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	int i, j, r = 0, pos0;
71472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
7174a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_init(ctx.bc, rctx->chip_class);
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
723f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
725eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) ||
726eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color));
727eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
728feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
729feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
731076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
732076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
733076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
734f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
735f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
736f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
738076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
739076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
740076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
741076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
75689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
7574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
758f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
7594a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
760f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
76289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
763fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
76484457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
7664d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_INPUT] + 1;
767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
7684d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
769d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
77097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
77197e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
77297e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
773d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
7747728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
7758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
7764d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
7778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
779cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
780cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
7815555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
787cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
788cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
789cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
790cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
791cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
792cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
793cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
794cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
795cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
796cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
807be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
808be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
809be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
8101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
8117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
8127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
8137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
8147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
8157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
81689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
8177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
81889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
81950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
82050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
82150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
826876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
8275555cd776b970bce020be59193054474a2a63317Dave Airlie			property = &ctx.parse.FullToken.FullProperty;
8285555cd776b970bce020be59193054474a2a63317Dave Airlie			if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
8295555cd776b970bce020be59193054474a2a63317Dave Airlie				if (property->u[0].Data == 1)
8305555cd776b970bce020be59193054474a2a63317Dave Airlie					shader->fs_write_all = TRUE;
8315555cd776b970bce020be59193054474a2a63317Dave Airlie			}
832876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
839eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
840457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
841eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
842eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* clamp color outputs */
843eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	if (shader->clamp_color) {
844eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		for (i = 0; i < noutput; i++) {
845eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			if (shader->output[i].name == TGSI_SEMANTIC_COLOR ||
846eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				shader->output[i].name == TGSI_SEMANTIC_BCOLOR) {
847eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
848eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				int j;
849eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				for (j = 0; j < 4; j++) {
8504a47662beaa2092447939db7880531fb706afeddMarek Olšák					struct r600_bytecode_alu alu;
8514a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
852eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
853eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					/* MOV_SAT R, R */
854eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
855eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.sel = shader->output[i].gpr;
856eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.chan = j;
857eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.write = 1;
858eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.clamp = 1;
859eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].sel = alu.dst.sel;
860eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].chan = j;
861eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
862eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (j == 3) {
863eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						alu.last = 1;
864eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					}
8654a47662beaa2092447939db7880531fb706afeddMarek Olšák					r = r600_bytecode_add_alu(ctx.bc, &alu);
866eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (r)
867eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						return r;
868eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				}
869eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			}
870eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		}
871eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	}
872eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
873543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
874543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
875543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
876543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
877543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
878543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
879543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
880543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
881543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
882543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
883543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
8842449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			if (so.output[i].start_component) {
8852449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   R600_ERR("stream_output - start_component cannot be non-zero\n");
8862449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
8872449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
888543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
889543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
890543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
891543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
892543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
8932449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			output.array_base = so.output[i].dst_offset;
894543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
895543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
896543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
897543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.array_size = 0;
8982449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			output.comp_mask = (1 << so.output[i].num_components) - 1;
899543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
900543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
901543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
902543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
903543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
904543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
905543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
906543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
907543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
908543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
909543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
910543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
911543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
912543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
913543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
914543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
915543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
916543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
917543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
918543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
919543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
920543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
921543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
922543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
923543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
924543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
925543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
926543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
927543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
928543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
929543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
930543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
931543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
932543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
933543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
934543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
935543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
936eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
937feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	j = 0;
938457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
9394a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&output[i], 0, sizeof(struct r600_bytecode_output));
940feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].gpr = shader->output[i].gpr;
941feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].elem_size = 3;
942feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_x = 0;
943feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_y = 1;
944feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_z = 2;
945feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_w = 3;
946feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].burst_count = 1;
947feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].barrier = 1;
948feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
949feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].array_base = i - pos0;
950feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
951457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
954feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 60;
955feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
957457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
958457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
959457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
960feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
961feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
962457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
963457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
968feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = shader->output[i].sid;
969feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
9704f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
971feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					for (j = 1; j < shader->nr_cbufs; j++) {
9724a47662beaa2092447939db7880531fb706afeddMarek Olšák						memset(&output[i + j], 0, sizeof(struct r600_bytecode_output));
973feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].gpr = shader->output[i].gpr;
974feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].elem_size = 3;
975feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_x = 0;
976feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_y = 1;
977feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_z = 2;
978feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_w = 3;
979feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].burst_count = 1;
980feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].barrier = 1;
981feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].array_base = shader->output[i].sid + j;
982feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
983feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
984feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
98560302f83e2344195f9a1c37215def09fa9c45ff9Marek Olšák					j = shader->nr_cbufs-1;
986feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
9875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
988feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
989feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 2;
990feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 7;
991feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
992feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
99339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
994feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
995feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 7;
996feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 1;
997feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
998feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
100972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
1010457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
1011feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	noutput += j;
1012457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
1013457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1014457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
1015457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
1016457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
1017457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
1018457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
1019457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1020457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
10214a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&output[i], 0, sizeof(struct r600_bytecode_output));
1022457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
1023457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
1024a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_x = 7;
1025a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_y = 7;
1026a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_z = 7;
1027a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_w = 7;
10288ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
1029457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
1030457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
1031457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
10327e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1033457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
1034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1035c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1036481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
1037481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
10384a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&output[0], 0, sizeof(struct r600_bytecode_output));
1039481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
1040481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
1041481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
1042481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
1043481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
1044481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
10458ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
1046481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
1047608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1048481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
1049a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1050481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
1051481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
1052457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1053457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
105489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
10557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
10567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
10577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1058457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1059b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1060b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1061a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1062c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1063c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1064457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1065457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
10664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
10707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
107189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
10724a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
10737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10743b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1078cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1085f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1086f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
10954a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1096a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1097a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1098a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1099a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1100a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1101a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1102a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1103a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1104a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1105a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1106a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
11074a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1108f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1109f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1110f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1111f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1112f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
11134a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
11143efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
11153efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
11163efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
11173efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
111880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
111980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
112080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
11214a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
11237a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11247a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
112947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
113047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
11317a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
11327a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
11337a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1136dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1138dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1139d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1140d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1141dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1142d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1143d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1144d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1145dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1146dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1147dffad730df17983cfaef0808555a8c26cad0aa15Christian König
11489b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1149dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1150dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11514a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1152dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1153dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1155d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1156d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1157d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1158d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
11594a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
116080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1162d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1163d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
11654a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1167d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
11684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
11694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
11744a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
11767a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
11774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
11787a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
11829b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
11854a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1192d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1193d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
11949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1195d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1196d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1197d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1198d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
11999b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
12009b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
12019b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
12029b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
12039b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
12049b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1205d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1206d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1207cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1208cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1209cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1210cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1211cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1212cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1213cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1214cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1215cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1216cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1217cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1218cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1219cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1220cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1221cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1222cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1223cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1224cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1225cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1226cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1227cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1228cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1229cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1230cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1231cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1232cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1233cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1234cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1235cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1236cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1237cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
12387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
12397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
12407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
12424a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
12437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
12447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
12464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
12487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12494a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
12507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
12517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
12537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
12557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
12564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
12577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
12587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
12597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
12607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
12617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
12627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
126488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
126588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
126688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
126788f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
12681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
126988f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
127096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
127196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
127296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
127396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
127496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
12754a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
12767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
12774a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1278a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
127988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
128088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
128188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
128288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
128388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
128488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
12854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
12867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1287921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
128888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1289a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
129096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1291ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
129288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
12934a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
129488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
129588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
129688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
12974a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1298a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
12997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
130088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
130188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
130288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
130388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
130488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
130588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
130688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
13074a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
130888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
130988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
131088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
13114a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1312a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
131388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
131488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
131588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
131688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
131788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
131888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
131988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
132088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
13217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1322921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
132388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1324921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1325ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
132696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
132789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1328a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1329a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
133096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
133196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
133296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
133396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
133496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
133596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
133688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
13374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
133888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
133988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
134092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
134192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
134292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
13437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
13447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
13457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
13477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
13487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
13564a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
13587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
13597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
13627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
13707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
137492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
137592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
137692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13774a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
137892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1379dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
138092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
13811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
138292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
138392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
138488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
13854a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
138688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
138788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
138888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
138988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
139088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
139188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
139288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
139388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
13944a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
139588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
139688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
139788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
139888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1399be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1400be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1401be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1402be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
14034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1404a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1405be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1406be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
140780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1408be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
140988f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
14104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
141188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
141288f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
141388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
141488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
141588f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
141688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
141792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
141892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
141992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14204a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
142292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
142357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
142457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
142557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
142657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
14271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
142857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
142957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
143057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
143192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
143292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
143357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
143489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
14357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
14364a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
14387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
14417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
14427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
14437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
14447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
14457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
14467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
14477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
14484a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
14497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
14507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
14517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
14527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
14534a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
14557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
145692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
14577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
14587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
14597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14604a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
14617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
146457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
146592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
146692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
146757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
146889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
14697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
14704a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
14727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
14747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
14757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
14767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
14777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
14787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
14797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
14807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
14814a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
14827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
14837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
14847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
14857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
14864a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
14887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
148957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
14907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
14917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
14927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
14947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
149757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
149892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1499ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1500ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
15014a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1502ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1503ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1504ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
150580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1506ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1507ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1508ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1509ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1510ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1511ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
15124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1513ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1514ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1515ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1516ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1517ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1518ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
15194a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1520ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1521ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1522ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
152380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1524ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1525ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1526ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1527ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1528ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1529ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
15304a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1531ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1532ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1533ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1534ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
153592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
153692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
153792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1538094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1539094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
15404a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1541094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1542094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1543094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
15444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1545094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
15464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1547094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
15484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1549921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
15504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
15514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
15524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
15534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
15544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
15554a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
15564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1557094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1558094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1559094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
15604a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1561094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1562094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1563094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
15644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
15654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
15664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
15674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1568094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1569094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1570094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
15710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
15720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
15730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
15750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
15760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1577f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
15784a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1579f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
15804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
1581f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1582f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
1583f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1584f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
1585f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
1586f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
1587f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1588f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
15894a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1590f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
1591f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
1592f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
15930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
15940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
15956a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
15966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
15977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
15986a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
159989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
16007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
1601f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
16024a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1604f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
1605f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
1606f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
1607f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
16087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
16097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
16107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
16117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
16127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
16137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16144a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
16157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
16167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
16177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
16187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
1619f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
16204a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1622f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
1623f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
16242fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
16252fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
16262fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
16277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16284a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
16297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
16307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
16317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
16320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
16336a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
16346a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
16350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
163686f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
16374a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1638a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
163986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
164086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
16414a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
16424a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
16430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
16440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
16450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
16460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
16470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
16484a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
16490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
16500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
16510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
165289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
16537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
16547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
16554a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
16577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
16587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
16597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
16617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
16627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
16637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
16647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
16654a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
16667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
16707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
16714a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
16737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
16747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
16757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
16767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
16810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1682abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
16838567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
16844a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16858567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
16868567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
16878567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
16888567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
16898567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
16904a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
16918567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
16928567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
16938567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
1694abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
16954a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1696abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
16974a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1698abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1699abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1700abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1701abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
17024a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1703abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1704abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1705abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1706abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
17074a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1708abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1709abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1710abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1711abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1712abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1713abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
17144a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1715abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1716abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1717abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
17180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
17190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
17200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
172142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
172242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
172342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17244a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
172542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
172642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
17274a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1728df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1729df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1730df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1731df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1732df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1733df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1734df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
173542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
17364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
17374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
173842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
173942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
174042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
174142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
17424a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
174342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
174442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
174542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
174642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
174742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
174842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1749a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
17507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
17517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17524a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1753a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
17547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
17557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
17564a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1758a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
17597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
176080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
17627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
17637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
17644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
17667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
17677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
17687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
17697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
17707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1771a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1772a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1773a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1775a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1776a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
17774a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1778a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1779a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
17804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
1781a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1782a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1783a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1784a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
17854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1786a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1787a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1788a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1789a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1790a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1791a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
17927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
17937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
17947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
17964a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
17977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
17987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
18004a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
18024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
18037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
18047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
18057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
18067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
18077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
18107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
18117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
18127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
18144a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
18164a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
18177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
18187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
18197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
18207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
18214a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
18227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
18237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
18247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
18267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
18274a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
18297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
18307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
18337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
18347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
18377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
18387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
18397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
18407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
18417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1842a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1843a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
18444a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1845a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1846a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1847a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
18484a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1849a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
18504a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1851a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1852a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1853a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
18544a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1855a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1856a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1857a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
18584a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
185966f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
18604a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
1861a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1862a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1863a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1864a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
18654a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1866a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1867a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1868a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
18694a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1870a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1871a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1872a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1873a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1874a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
18754a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1876a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1877a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1878a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1879a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1880a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
18810d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
18820d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
18830d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18844a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1885921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
18860d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18870d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
18880d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
18894a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1890a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
18910d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1892cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
18930d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1894cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
18950d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
1897921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
18984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
18990d48925a56ad4fb253386110b545abda82a25464Dave Airlie
19000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
19010d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
19024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19030d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
19040d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
19050d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
19060d48925a56ad4fb253386110b545abda82a25464Dave Airlie
19070d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
19080d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
19094a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1910a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
19110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
191280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19130d48925a56ad4fb253386110b545abda82a25464Dave Airlie
19140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1915cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
19160d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
19170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1918921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
19190d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
19200d48925a56ad4fb253386110b545abda82a25464Dave Airlie
19210d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1922cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
19230d48925a56ad4fb253386110b545abda82a25464Dave Airlie
19240d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
19250d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
19264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
19280d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
19290d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
19300d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
19310d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
19320d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1934cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
19354a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1936cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1937cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1938cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
19394a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1940cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1941a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
19426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1943cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1944a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
194580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1946cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1947cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1948cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1949cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1950cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1951cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
19524a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1953cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1954cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1955cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1956cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1957cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1958cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19624a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1964dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
19667be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
19677be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
19687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
19697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
19704a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
19734a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
19757be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
197680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1978cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1979de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
19807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
19834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1984de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1985de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
19877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1988cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1989cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1990cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19934a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1994cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1995cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
19974a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1999cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
20004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
2001cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
2002a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
200380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2004cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
2005a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
2006cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
2007cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
2008cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
2009cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
2010921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
2011cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
2012cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
2013cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2014cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
2015cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
2016921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
2017cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
2018cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
2019cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2020e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
2021e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
2022e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
2023e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
2024e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
2025e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
2026e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
2027cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
2028cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
2030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
2031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
2032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
20334a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
2035de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
2036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
20377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
2038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
2039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
20406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
20416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
20426415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
20436415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20446415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
20456415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
20466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
20476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
20486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
20496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
20506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
20516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
20526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
20546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
20556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
205633241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
205733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
205896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
205933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20604a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
20614a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2062641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
206340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
2064bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
2065da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
2066da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
20676415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
206878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
206913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
20701d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	u8 offset_x = 0, offset_y = 0, offset_z = 0;
2071641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
20726415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
2073641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
20741d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
20751d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
20761d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
20771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
20781d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
20791d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
20801d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
20811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
20821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
20831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
208413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
208513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
208613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
208740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
208840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
20894a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
209040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
209140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
209240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
209340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
209440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
209540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
209640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
209740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
209840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
209940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
210040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
210140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
210240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
21034a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
210440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
21054a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
210640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
210740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
210840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
210940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
211040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
21114a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
211240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
211340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
211440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
211513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
211640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
211740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
211840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
211940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
212040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
212140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
212240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
212340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
212440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
212540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
212640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
212740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
212840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
212940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
213040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
213140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
21324a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
213340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
213440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
213513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
213613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
21377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
2138b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
213989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
21417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
21424a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
21444a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
2145bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
21467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
21477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
21487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
21517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21524a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
21577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
21594a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
21614a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
21627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
21637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
21647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
21657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
21674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
21719d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
2172b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
21734a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2174a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2175b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
21767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
21774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2178b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2179b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2180b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
21814a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2182b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2183b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2184b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
21854a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2186a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2187921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2188b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
2189b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
2190b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
2191b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
2192b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
21934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2194b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
2195b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
219678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2197b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2198bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2199bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2200bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
22010e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
22020e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
2203bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2204bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
2205bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
22064a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2207a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
22084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
22094a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
2210bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
2211bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
2212bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
2213bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
2214bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
22154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2216bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
2217bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
2218bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
2219bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2220bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
222189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22234a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
22257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
22267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
22277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
22287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
22297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
22307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
22317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
22337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22344a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
22394a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
22417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
22427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
22437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
22447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
22457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
22467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
22477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22484a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2253bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
2254bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
22557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
2256bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
22574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2258a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2259bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2260bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2261bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2262bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
2263bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2264bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
22657ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2266bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2267bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2268a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2269bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2270bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2271bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
2272bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2273bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
22744a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2275bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2276bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2277bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
22784a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2279a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2280bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2281bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2282bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2283bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
2284bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2285bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
22867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2287bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2288bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2289a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2290bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2291bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2292bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
2293bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2294bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2295bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
22964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2297bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2298bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2299bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
230078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2301bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
2302bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2303bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
230478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
2305b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
23064a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2307a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
23084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2309b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2310b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2311b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
2312b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
2313b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
23144a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2315b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2316b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2317b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
231878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2319b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2320b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
23217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2322bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2323929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
2324929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
23256b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
2326929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
2327929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
2328de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
2329de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
2330de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
2331de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2332de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
2333de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
2334de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2335c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
2336c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
2337c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
2338de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
2339de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
2340de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2341de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
2342de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
234333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
23444a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
2345bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
23466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
23476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
2348077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
2349641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
23506c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
23519d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
23529d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
23539d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
23549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
235578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
235678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
235778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
235878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
235978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
236078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
236178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
236278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
236378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
236478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
2365244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
236678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
23679a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2368bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2369bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2370bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2371bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2372bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2373bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2374bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
23756b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
23766b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
237701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
237801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
237901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
23806b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
23816b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
2382bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
23831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
23841d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
23851d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
238669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2387929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
2388929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
2389929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
2390929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
2391929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
23926b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
2393929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
2394929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
2395929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
239678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2397929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
2398929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
2399929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
2400929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
2401929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
2402929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
2403929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
2404929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
2405929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
2406929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
2407929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
2408929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
2409929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
2410929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
2411929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
2412929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
2413929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
2414bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
24154a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
2416bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2417bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2418bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2419bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2420bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
242133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
242233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2423b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2424b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24264a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2427dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2431c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
24321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2433c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2434c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2435c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2436c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
24374a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2438c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
24394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
24404a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2441c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
244280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2443c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2444c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2445c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2446c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
24474a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2448c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2449c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2450c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2451c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2452c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2453c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2454b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2455dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2456dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2457dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2458dffad730df17983cfaef0808555a8c26cad0aa15Christian König
24594a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2460a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2461921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2462b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
24634a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
24644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
2465b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2466b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2467dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2468b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2469b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2470b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
24714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2472b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2473b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2474b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2475b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2476b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2477dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2478dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2479dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2480dffad730df17983cfaef0808555a8c26cad0aa15Christian König
24814a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2482a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2483b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2484b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
24854a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2486b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2487b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2488dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2489b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2490b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2491b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
24924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2493b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2494b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2495b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2496b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2497b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2498dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2499dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2500dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2501dffad730df17983cfaef0808555a8c26cad0aa15Christian König
25024a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2503a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2504b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
25054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
25064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2507b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2508b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2509dffad730df17983cfaef0808555a8c26cad0aa15Christian König
251080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2511b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2512dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2513b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2514b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
25154a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2516b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2517b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2518b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2519dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2520b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2521b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
252287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
252387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
252487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
25254a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
252687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2527dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
252887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
25297be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
25307be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
25317be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
253287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
25334a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2534a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
25354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
25364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
25374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
253880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
253987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
254087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
254187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
25427be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
254387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
25444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
254587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
254687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
25477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
254887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
254987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
255087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
25510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
25520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
25530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
25540e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
25550e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
25564a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
25570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
25580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
25590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
25610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
25620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
25644a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2565a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
25660e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
25674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
25684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
25690e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
25700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
25710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
25720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
25730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
25740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
25750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
25770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
25780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
25790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
25810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
25824a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
25830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
25840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
25850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
25860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
25884a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2589a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
25900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25910e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
25924a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
25934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
25940e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
25950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
25960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
25970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
25980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
25990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
26000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
26020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
26030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
26040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
26060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
260780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
260880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
26090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
26100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
26110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
26120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
26130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
26144a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
26150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
26160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
26170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
26180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
26190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
26200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
26210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
26220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
262336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
262436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
262536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
26264a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
262709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
26287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
262936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
263036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
263136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
26324a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
263336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2634a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
26354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
263636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
263736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
263836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
263936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
264036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
26414a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
264236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
264336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
264436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
264589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
26487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
26497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
265036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
26517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
26547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
26574a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
26587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
26617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
26637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
26647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
26657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
26687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
26704a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
26717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
267436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
26757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
267636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
267736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
26784a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
267936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2680a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
26814a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
268236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
268336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2684b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2685b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2686b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2687b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2688b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
268936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
269036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
269136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
269236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
269336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
26944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
269536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
269636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
269736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
269836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
269936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
270036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
270189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27034a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
27054a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
270636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
27077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
27107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
27127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
271336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
27144a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
27187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27194a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
27214a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
272236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
27237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
27257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
27267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
27287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27294a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
27307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
27317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
27327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
273336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
273436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
273536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
273636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
27374a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
273836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2739a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
274036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
274136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
274236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
274336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
274436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
274536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
274636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
27474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
274836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
274936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
275036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
275136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
275236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
275387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2754460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2755460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2756460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
27574a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2758460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2760460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2761f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
2762460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
276389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27654a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2766460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27684a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27694a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
27707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
27747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
27774a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2781460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27834a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27864a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
27887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
27917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
27927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
27934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
27947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
27957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
27967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2797460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2798460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2799460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2800460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2801460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2802460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2803460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2804460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2805460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2806460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28074a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2808460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2809460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2810460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2811460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2812f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
2813460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2814460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
281589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
28167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
28174a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
281896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
28204a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
28214a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
282296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
28247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
28257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
28267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
28277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
28287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
28297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28304a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
28317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
28327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
28337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
28347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
28354a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
28384a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
28394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
28407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
28427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
28437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
28447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
28457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
28477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
28487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
28497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
285096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28514a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
285296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
285396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
285496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
285596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
285696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
285796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
285896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
285996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
286096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
286196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28624a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
286396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
286496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
286596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
286689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
28677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
28684a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
28707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
28717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
28727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
28747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
28757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
28767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
28777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
28787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
287996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28804a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
28817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
28827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
28837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
28847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
28854a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
28877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
28887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
288996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
28917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
28927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
28937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
289496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28954a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
28967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
28977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
28987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
289996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
290089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
29017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
29024a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
29047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
29057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
29067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
29087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
29097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
29107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
29117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
29127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
29137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29144a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
29157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
29167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
29177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
29187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
29194a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
29217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
29227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
292396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
29257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
29267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
29277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
292896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29294a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
29307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
29317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
29327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
293396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29344a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
293596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
293696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
293796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29384a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
29394a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
294096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
294196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
294296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2943460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2944460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2945460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2946460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2947460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2948460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
29494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2950460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2951460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2952460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2953460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2954f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
2955460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
295689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
29577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
29584a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2959460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
29607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
29614a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
29624a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
2963460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
29647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
29657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
29667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
29677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
29687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
29697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
2970460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
29714a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
29727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
29737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
29747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
29757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
29764a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
29794a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
29804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
29817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
29837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
29847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
29857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
29867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
29887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
29897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
29907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2991460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2992460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2993460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2994460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
29954a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2996460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2997460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2998460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2999460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
3000460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3001460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3002460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
3003460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3004460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3005460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
30064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3007460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3008460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3009460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3010460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3011460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
3012460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
3013460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
301498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
301598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
301698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30174a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
301898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
3019a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
30204a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
302198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
302252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
302352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
302452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
302552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
302652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
302752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
302852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
30299b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
30308e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
30319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
303252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
303352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
303452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
303552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
303652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
30378e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
303898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
30398e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
30408e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
30414a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
304298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
304398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
30448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
30458e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
304698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
304798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
304898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
304947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
305047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30514a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
305247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
3053a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
30547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
30557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
3056077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
3057077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
30584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
30598e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
3060077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
3061077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
3062077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
30634a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3064077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
3065077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
3066077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
3067077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
30688e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
30698e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
3070077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
3071077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
3072077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
30734a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3074077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
30757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
30767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
3077077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
3078077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
30794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
30808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
3081077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
3082077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
3083077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
30844a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3085077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
30867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
30879b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
30888e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
30898e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
30908e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
30918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
30928e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
30938e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
30948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
30958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30968e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
30979b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
30987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
30997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
31007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
31017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
31027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
31038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
310447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
310547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
310647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
310757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
310857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
310957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
31104a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
311157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
311257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
311357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
31144a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
311557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3116a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
311780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
31187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
31197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
312057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
312157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
31224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
312357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
312457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3125a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
312657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
312757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
31284a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
312957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
313057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
313157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
31324a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
313357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
313457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
313557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
313657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
313757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
313857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3139a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
3140a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
31414a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3142a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
3143a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
31444a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3145a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
3146a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
3147a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
3149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
3150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
3151a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
31524a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
3153a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
3154a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
31557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3156a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
3157a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
31584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
3159a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
3160a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
3161a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3162a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3163a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3164a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
3165a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
31662bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
31672bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
31682bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
31692bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
31702bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
31714f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
31722bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
31734f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
31742bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
31752bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
31762bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
31772bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
31784f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
31792bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
31802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
31814f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
31822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
31832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
31842bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
31852bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
31862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
31872bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
31882bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
31894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
31908813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
31918813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
31928813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
31932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
3194a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3195a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3196a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
319709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
3198a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
319909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
320009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
320109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
320209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
320309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
320409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
320509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
320609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
320709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
320809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
320909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
321009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
321109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3213a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
321409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
321509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
321609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
321809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
321909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
322009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
322109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
322209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
322309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
322409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
3225a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
3226a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
3227a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
322809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
322909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
323009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
323109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
323209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
323309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
323409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
32357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
323609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
323709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
323809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
323909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
324009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
324109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
324209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
324309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
324409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
324509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
324609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
324709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
324809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
324909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
325009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
325109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
325209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
325309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
325409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
325509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
325609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
325709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
325809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
325909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
32604a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
32614a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
326209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
326309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
326409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3265a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
326609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
326709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3268a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
326909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
327009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
327109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
327209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
327309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
327409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
327509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
327609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
327709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
327809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
327909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
328009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
328109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
328209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
328309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
328409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
328509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
328609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
328709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
328809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
32894f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
329009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
329109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
329209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
329309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
329409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
329509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
32964f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
329709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
329809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
329909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
330009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3301a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
330209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
330309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
330409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
330509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
330609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
330709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
330809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
33097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
331009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
331109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
331209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
331309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
331409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
331509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
331609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
331809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
331909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
332009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
332109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
332309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
332409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
33254a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
332609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
332709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
332809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
332909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
333009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
333109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
333209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
333309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
333409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
333509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
33368b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
333709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
33384a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
333909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
334009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
334109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
334209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
3343a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3344a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3345a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3346a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
3347a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
33484a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
3349a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
3350a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
335109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
3352a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
3353a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3354a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3355a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3356a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
3357a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
3358a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
3359a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
3360a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
3361a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
3362a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
3363a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3364a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
3365a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
3366a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
3367a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
336809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
3369a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
337009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
337109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
337209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
337309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
337409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
337509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
337609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
337709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
33784a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
337909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
338009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
3381a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
338209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
338309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
338409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
338509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
338609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
338709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
338809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
338909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
339009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
33914a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
339209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
339309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
339409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
339509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
339609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
339709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
339809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
339909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
340009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
340109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
340209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
340309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
340409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
340509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
340609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
340709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
340809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
340909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
341009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
341109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
341209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
341309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
341409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
341509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
341609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
341709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
341809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
341909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
342009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
342109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
342209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
342309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
342409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
342509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
342609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
342709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
342809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
342909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
343009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
34314a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
343209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
343309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
343409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
343509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
343609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
343709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3438a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3439a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3440a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3441cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
3442cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
3443cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3444cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
3445cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
3446cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3447cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3448cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
3449cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3450cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3451cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3452cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3453cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3454cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3455cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
3456cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
3457cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
3458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3459c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
3460cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
3461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3462cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3463cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
34649b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
3465cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3467cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3468cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3470cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3471cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3472cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3473cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3474cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3475cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3476cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3477cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3478c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
3479cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3480cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3481cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
3482cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3483cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3484cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
3485cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
3486cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3487cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3488cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3489cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3490cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3491cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
3492cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
3493cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
349598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
34970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3498df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3499df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3500df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3501df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3502df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3503df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3504df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
350542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
350636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3507460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3510cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3511cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
351257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3513dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3515d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3516be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3519b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35273af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35293af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3530df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
35317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
35324558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3533a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
35340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35377a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3539e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
354088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
35413af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
35423af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
35434502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35490d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
355288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3553d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
35540d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3556b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
355713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
3558b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35659f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35690d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
357087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
357192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3572c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
3573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3576ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
357709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3582a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3583a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3590c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
3591cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
35920ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3596c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
3597c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
3598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3599cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
3600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36011d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
36021d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
360309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
360609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
360809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3625094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3629bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
3630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3631c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3632c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
3633c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_op2},
3634c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
3635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3636c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2},
3637c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
36389a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
3639c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
3640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3641c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
3642c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
3643c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
3644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3645c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2},
3646c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
3647c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
3648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3649c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3650c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
3651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3655cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3656cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3657cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3658cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3659cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3660cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3661cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3662cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3663cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3664cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3665cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3666cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
36679b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
36689b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
3669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
367150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
367250526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
367398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
367450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
367550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
367650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
36778ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
367850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3679112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
368050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
368150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
368250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
368350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
368450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
368550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
368650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
368750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
368850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
368950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
369050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
369150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
369250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
369450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
369750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
370050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3702df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
370350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
370450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
370550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
370650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
370750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
370850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
371050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
371150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
371250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
371350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
371450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
371550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
371650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
371750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
371850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
371950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
372050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
372150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
372250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
372350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
372450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
372550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
372650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
372750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
372850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
372913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
373050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
373150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
37427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
37437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3744c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
37457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
37487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
37497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
37507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
37517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3762608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
3763cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
37647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3768cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
3769cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3771cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
37727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37731d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
37741d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
37987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
37997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3801cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
38027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3803cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3804cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
3805cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
3806cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
38077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3808cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3810cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
3811cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
38127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3813cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
3814cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
3815cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
38167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38179b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
3818cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
3819cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
38207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3821cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3822cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
38237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3827cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3828cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3829cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3830cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3831cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3832cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3833cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3834cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3835cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3836cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3837cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3838cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
38399b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
38409b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3874df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
38797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
38847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
38857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
38997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
390113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
391050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
391450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
391550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3916c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
391750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3920ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
392150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
392250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
392350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
392450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
392550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
392650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
392750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
392850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
392950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
393050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
393150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
393250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
393350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
393450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3935cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
39360ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
393750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
393850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
393950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
394050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
394150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
394250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3943cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
394450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39451d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
39461d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
394750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
394850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
394950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
395050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
395150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
395250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
395350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
395450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
395550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
395650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
395750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
395850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
395950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
396150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
396950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
397050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
397150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
397250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
397350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
397450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3975cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3976cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
397750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
397850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
397950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
398950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
399850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3999cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4000cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4001cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4002cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4003cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4004cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4005cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4006cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4007cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4008cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4009cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4010cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
40119b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, 0, tgsi_unsupported},
40129b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
401350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
401450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
4015