r600_shader.c revision 6b44470bb2103d5a9c3cf5f2fb4490566971476c
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
1881a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
1882a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin{
1883a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1884a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	struct r600_bytecode_alu alu;
1885a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	int i, r;
1886a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
1887a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
1888a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1889a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	for (i = 0; i < 4; i++) {
1890a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (!(write_mask & (1<<i)))
1891a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			continue;
1892a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1893a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1894a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
1895a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1896a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.dst.sel = ctx->temp_reg;
1897a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.dst.chan = i;
1898a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.dst.write = 1;
1899a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1900a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
1901a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (i == last_inst)
1902a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			alu.last = 1;
1903a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
1904a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (r)
1905a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			return r;
1906a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	}
1907a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1908a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	for (i = 0; i < 4; i++) {
1909a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (!(write_mask & (1<<i)))
1910a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			continue;
1911a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1912a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1913beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin		alu.inst = ctx->inst_info->r600_opcode;
1914a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1915a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1916a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1917a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
1918a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.src[0].chan = i;
1919a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1920a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (i == last_inst)
1921a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			alu.last = 1;
1922a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
1923a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (r)
1924a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			return r;
1925a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	}
1926a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
1927a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	return 0;
1928a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin}
1929a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
19306b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
19316b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
19326b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19336b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
19346b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
19356b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
19366b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
19376b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19386b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
19396b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
19406b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
19416b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
19426b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
19456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
19476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
19486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
19496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
19516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
19526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
19546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
19556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
19566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
19576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
19586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
19596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
19616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
19626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
19636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
19646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
19676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
19686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
19696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
19736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
19746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
19756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
19766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
19786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
19796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
19806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
19816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
19826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
19836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
19846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
19856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
19880d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
19890d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
19900d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19914a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1992921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
19930d48925a56ad4fb253386110b545abda82a25464Dave Airlie
19940d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
19950d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
19964a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1997a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
19980d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1999cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
20000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
2001cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
20020d48925a56ad4fb253386110b545abda82a25464Dave Airlie
20034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2004921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
20054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
20060d48925a56ad4fb253386110b545abda82a25464Dave Airlie
20070d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
20080d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
20094a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20100d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
20110d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
20120d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
20130d48925a56ad4fb253386110b545abda82a25464Dave Airlie
20140d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
20150d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
20164a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2017a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
20180d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
201980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20200d48925a56ad4fb253386110b545abda82a25464Dave Airlie
20210d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2022cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
20230d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
20240d48925a56ad4fb253386110b545abda82a25464Dave Airlie
2025921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
20260d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
20270d48925a56ad4fb253386110b545abda82a25464Dave Airlie
20280d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
2029cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
20300d48925a56ad4fb253386110b545abda82a25464Dave Airlie
20310d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
20320d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
20334a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20340d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
20350d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
20360d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
20370d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
20380d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
20390d48925a56ad4fb253386110b545abda82a25464Dave Airlie
2040cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
2041cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
20424a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2043cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
2044cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2045cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
20464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2047cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
2048a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
20496c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
2050cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
2051a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
205280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2053cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
2054cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
2055cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
2056cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
2057cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
2058cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
20594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2060cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
2061cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
2062cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
2063cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
2064cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
2065cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
2067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
2068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20694a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
2071dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
20737be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
20747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
20757be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
20767be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
20774a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
2079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
20804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
2081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
20827be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
208380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
2085cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
2086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
20877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
2088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
2089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
20904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
2092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
2093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
20947be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
2095cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
2096cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2097cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
2098cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
2099cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21004a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2101cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
2102cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
21044a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2105cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
2106cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
21074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
2108cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
2109a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
211080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2111cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
2112a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
2113cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
2114cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
2115cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
2116cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
2117921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
2118cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
2119cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
2120cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2121cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
2122cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
2123921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
2124cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
2125cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
2126cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2127e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
2128e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
2129e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
2130e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
2131e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
2132e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
2133e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
2134cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
2135cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
2137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
2138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
2139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
21404a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
2142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
2143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
21447be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
2145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
2146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
21476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
21486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
21496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
21506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
21526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
21536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
21546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
21556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
21566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
21576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
21586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
21596415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
21616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
21626415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
216333241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
216433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
216596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
216633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21674a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
21684a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2169641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
217040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
2171bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
2172da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
2173da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
21746415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
217578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
217613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
21771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	u8 offset_x = 0, offset_y = 0, offset_z = 0;
2178641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
21796415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
2180641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
21811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
21821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
21831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
21841d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
21851d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
21861d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
21871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
21881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
21891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
21901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
219113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
219213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
219313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
219440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
219540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
21964a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
219740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
219840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
219940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
220040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
220140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
220240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
220340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
220440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
220540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
220640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
220740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
220840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
220940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
22104a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
221140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
22124a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
221340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
221440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
221540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
221640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
221740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
22184a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
221940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
222040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
222140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
222213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
222340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
222440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
222540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
222640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
222740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
222840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
222940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
223040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
223140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
223240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
223340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
223440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
223540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
223640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
223740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
223840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
22394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
224040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
224140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
224213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
224313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
22447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
2245b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
224689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
22487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22494a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
22514a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
2252bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
22537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
22547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
22557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22594a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
22657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
22664a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
22684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
22717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
22744a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22789d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
2279b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
22804a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2281a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2282b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
22837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
22844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2285b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2286b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2287b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
22884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2289b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2290b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2291b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
22924a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2293a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2294921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
2296b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
2297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
2298b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
2299b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
23004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2301b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
2302b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
230378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2305bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2306bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2307bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
23080e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
23090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
2310bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2311bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
2312bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
23134a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2314a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
23154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
23164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
2317bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
2318bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
2319bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
2320bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
2321bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
23224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2323bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
2324bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
2325bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
2326bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2327bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
232889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
23297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23304a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
23327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
23337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
23347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
23357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
23367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
23377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
23387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
23407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23414a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
23427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23464a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
23487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
23497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
23507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
23517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
23527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
23537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
23547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23554a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
23567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
23597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2360bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
2361bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
23627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
2363bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
23644a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2365a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2366bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2367bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2368bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2369bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
2370bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2371bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
23727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2373bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2374bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2375a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2376bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2377bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2378bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
2379bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2380bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
23814a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2382bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2383bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2384bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
23854a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2386a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2387bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2388bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2389bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2390bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
2391bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2392bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
23937ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2394bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2395bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2396a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2397bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2398bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2399bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
2400bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2401bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2402bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
24034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2404bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2405bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2406bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
240778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2408bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
2409bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2410bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
241178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
2412b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
24134a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2414a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
24154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2416b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2417b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2418b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
2419b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
2420b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
24214a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2422b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2423b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2424b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
242578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2426b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2427b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
24287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2429bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2430929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
2431929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
24326b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
2433929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
2434929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
2435de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
2436de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
2437de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
2438de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2439de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
2440de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
2441de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2442c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
2443c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
2444c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
2445de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
2446de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
2447de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2448de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
2449de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
245033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
24514a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
2452bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
24536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
24546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
2455077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
2456641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
24576c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
24589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
24599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
24609d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
24619d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
246278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
246378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
246478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
246578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
246678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
246778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
246878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
246978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
247078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
247178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
2472244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
247378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
24749a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2475bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2476bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2477bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2478bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2479bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2480bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2481bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
24826b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
24836b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
248401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
248501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
248601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
24876b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
24886b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
2489bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
24901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
24911d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
24921d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
249369d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2494929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
2495929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
2496929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
2497929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
2498929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
24996b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
2500929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
2501929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
2502929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
250378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2504929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
2505929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
2506929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
2507929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
2508929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
2509929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
2510929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
2511929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
2512929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
2513929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
2514929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
2515929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
2516929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
2517929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
2518929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
2519929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
2520929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
2521bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
25224a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
2523bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2524bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2525bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2526bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2527bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
252833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
252933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2530b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2531b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2532b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
25334a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2534dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2535b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2536b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2537b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2538c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
25391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2540c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2541c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2542c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2543c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
25444a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2545c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
25464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
25474a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2548c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
254980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2550c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2551c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2552c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2553c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
25544a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2555c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2556c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2557c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2558c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2559c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2560c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2561b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2562dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2563dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2564dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2565dffad730df17983cfaef0808555a8c26cad0aa15Christian König
25664a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2567a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2568921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2569b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
25704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
25714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
2572b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2573b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2574dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2575b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2576b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2577b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
25784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2579b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2580b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2581b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2582b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2583b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2584dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2585dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2586dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2587dffad730df17983cfaef0808555a8c26cad0aa15Christian König
25884a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2589a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2590b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2591b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
25924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2593b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2594b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2595dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2596b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2597b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2598b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
25994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2600b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2601b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2602b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2603b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2604b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2605dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2606dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2607dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2608dffad730df17983cfaef0808555a8c26cad0aa15Christian König
26094a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2610a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2611b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
26124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26134a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2614b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2615b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2616dffad730df17983cfaef0808555a8c26cad0aa15Christian König
261780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2618b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2619dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2620b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2621b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
26224a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2623b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2624b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2625b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2626dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2627b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2628b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
262987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
263087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
263187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
26324a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
263387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2634dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
263587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
26367be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
26377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
26387be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
263987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
26404a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2641a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
26424a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26434a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
26444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
264580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
264687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
264787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
264887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
26497be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
265087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
26514a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
265287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
265387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
26547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
265587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
265687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
265787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
26580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
26590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
26600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
26610e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
26620e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
26634a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
26640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
26650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
26660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
26680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
26690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
26714a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2672a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
26730e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
26744a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
26754a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
26760e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
26770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
26780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
26790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
26800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
26810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
26820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
26840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
26850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
26860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
26880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
26894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
26900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
26910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
26920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
26930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
26954a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2696a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
26970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
26980e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
26994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
27004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
27010e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
27020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
27030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
27040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
27050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
27060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
27070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
27080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
27090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
27100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
27110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
27120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
27130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
271480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
271580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
27160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
27170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
27180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
27190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
27200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
27214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
27220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
27230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
27240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
27250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
27260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
27270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
27280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
27290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
273036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
273136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
273236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
27334a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
27357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
273636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
273736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
273836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
27394a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
274036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2741a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
27424a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
274336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
274436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
274536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
274636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
274736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
27484a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
274936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
275036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
275136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
275289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
27557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
27567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
275736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
27587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
27617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
27644a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
27687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
27707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
27717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
27727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
27757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
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		}
278136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
27827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
278336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
278436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
27854a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
278636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
27884a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
278936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
279036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2791b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2792b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2793b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2794b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2795b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
279636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
279736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
279836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
279936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
280036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
28014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
280236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
280336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
280436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
280536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
280636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
280736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
280889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
28097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
28104a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
28124a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
281336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
28147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
28157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
28167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
28177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
28187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
28197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
282036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
28214a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
28227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
28237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
28247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
28257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
28264a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
28284a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
282936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
28307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
28317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
28327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
28337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
28357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
28377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
28387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
28397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
284036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
284136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
284236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
284336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
28444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
284536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2846a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
284736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
284836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
284936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
285036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
285136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
285236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
285336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
28544a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
285536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
285636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
285736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
285836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
285936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
286087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2861460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2862460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2863460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
28644a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2865460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
28667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2867460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2868f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
2869460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
287089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
28717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
28724a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2873460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
28754a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
28764a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
28777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
28797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
28807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
28817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
28827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
28837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
28844a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
28857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
28867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
28877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2888460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
28904a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
28934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
28944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
28957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
28977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
28987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
28997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
29004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
29017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
29027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
29037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2904460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2905460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2906460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2907460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2908460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2909460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2910460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2911460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2912460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2913460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
29144a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2915460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2916460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2917460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2918460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2919f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
2920460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2921460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
292289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
29237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
29244a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
292596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
29274a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
29284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
292996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
29317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
29327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
29337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
29347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
29357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
29367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29374a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
29387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
29397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
29407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
29417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
29424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
29454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
29464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
29477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
29497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
29507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
29517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
29527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29534a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
29547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
29557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
29567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
295796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29584a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
295996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
296096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
296196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
296296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
296396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
296496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
296596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
296696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
296796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
296896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
297096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
297196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
297296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
297389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
29747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
29754a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
29777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
29787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
29797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
29817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
29827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
29837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
29847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
29857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
298696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29874a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
29887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
29897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
29907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
29917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
29924a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
29947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
29957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
299696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
29977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
29987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
29997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
30007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
300196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
30024a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
30037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
30047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
30057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
300696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
300789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
30087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
30094a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
30117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
30127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
30137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
30147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
30157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
30167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
30177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
30187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
30197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
30207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
30214a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
30227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
30237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
30247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
30257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
30264a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
30287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
30297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
303096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
30317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
30327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
30337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
30347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
303596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
30364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
30377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
30387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
30397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
304096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
30414a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
304296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
304396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
304496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
30454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
30464a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
304796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
304896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
304996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
3050460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3051460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3052460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
3053460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3054460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3055460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
30564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3057460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3058460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3059460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3060460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3061f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
3062460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
306389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
30647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
30654a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3066460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
30677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
30684a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
30694a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
3070460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
30717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
30727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
30737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
30747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
30757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
30767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
3077460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
30784a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
30797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
30807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
30817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
30827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
30834a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
30857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
30864a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
30874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
30887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
30897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
30907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
30917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
30927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
30937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
30944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
30957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
30967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
30977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
3098460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3099460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3100460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
3101460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
31024a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3103460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3104460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3105460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
3106460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
3107460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3108460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3109460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
3110460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3111460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3112460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
31134a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3114460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3115460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3116460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3117460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3118460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
3119460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
3120460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
312198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
312298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
312398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
31244a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
312598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
3126a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
31274a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
312898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
312952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
313052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
313152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
313252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
313352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
313452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
313552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
31369b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
31378e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
31389b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
313952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
314052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
314152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
314252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
314352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
31448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
314598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
31468e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
31478e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
31484a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
314998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
315098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
31518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
31528e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
315398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
315498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
315598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
315647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
315747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
31584a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
315947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
3160a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
31617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
31627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
3163077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
3164077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
31654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
31668e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
3167077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
3168077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
3169077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
31704a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3171077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
3172077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
3173077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
3174077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
31758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
31768e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
3177077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
3178077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
3179077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
31804a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3181077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
31827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
31837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
3184077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
3185077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
31864a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
31878e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
3188077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
3189077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
3190077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
31914a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3192077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
31937ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
31949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
31958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
31968e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
31978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
31988e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
31998e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
32008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
32018e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
32028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
32049b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
32057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
32067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
32077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
32087ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
32097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
32108e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
321147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
321247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
321347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
321457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
321557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
321657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
32174a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
321857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
321957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
322057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
32214a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
322257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3223a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
322480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32257ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
32267ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
322757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
322857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
32294a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
323057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
323157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3232a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
323357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
323457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
32354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
323657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
323757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
323857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
32394a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
324057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
324157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
324257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
324357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
324457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
324557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3246a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
3247a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
32484a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3249a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
3250a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
32514a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3252a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
3253a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
3254a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3255a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
3256a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
3257a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
3258a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
32594a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
3260a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
3261a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
32627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3263a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
3264a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
32654a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
3266a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
3267a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
3268a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3269a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3270a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3271a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
3272a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
32732bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
32742bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
32752bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
32762bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
32772bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
32784f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
32792bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
32804f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
32812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
32822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
32832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
32842bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
32854f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
32862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
32872bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
32884f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
32892bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
32902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
32912bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
32922bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
32932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
32942bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
32952bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
32964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
32978813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
32988813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
32998813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
33002bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
3301a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3302a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3303a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
330409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
3305a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
330609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
330709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
330809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
330909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
331009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
331109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
331209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
331309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
331409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
331509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
331609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
331809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
331909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3320a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
332109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
332309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
332409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
332509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
332609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
332709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
332809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
332909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
333009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
333109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
3332a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
3333a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
3334a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
333509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
333609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
333709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
333809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
333909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
334009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
334109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
33427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
334309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
334409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
334509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
334609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
334709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
334809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
334909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
335009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
335109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
335209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
335309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
335409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
335509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
335609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
335709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
335809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
335909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
336009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
336109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
336209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
336309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
336409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
336509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
336609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
33674a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
33684a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
336909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
337009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
337109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3372a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
337309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
337409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3375a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
337609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
337709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
337809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
337909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
338009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
338109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
338209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
338309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
338409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
338509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
338609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
338709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
338809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
338909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
339009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
339109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
339209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
339309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
339409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
339509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
33964f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
339709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
339809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
339909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
340009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
340109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
340209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
34034f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
340409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
340509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
340609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
340709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3408a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
340909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
341009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
341109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
341209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
341309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
341409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
341509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
34167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
341709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
341809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
341909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
342009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
342109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
342209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
342309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
342409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
342509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
342609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
342709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
342809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
342909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
343009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
343109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
34324a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
343309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
343409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
343509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
343609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
343709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
343809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
343909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
344009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
344109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
344209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
34438b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
344409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
34454a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
344609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
344709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
344809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
344909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
3450a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3451a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3452a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3453a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
3454a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
34554a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
3456a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
3457a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
345809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
3459a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
3460a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3461a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3462a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3463a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
3464a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
3465a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
3466a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
3467a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
3468a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
3469a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
3470a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3471a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
3472a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
3473a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
3474a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
347509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
3476a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
347709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
347809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
347909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
348009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
348109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
348209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
348309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
348409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
34854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
348609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
348709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
3488a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
348909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
349009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
349109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
349209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
349309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
349409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
349509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
349609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
349709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
34984a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
349909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
350009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
350109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
350209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
350309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
350409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
350509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
350609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
350709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
350809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
350909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
351009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
351109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
351209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
351309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
351409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
351509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
351609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
351709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
351809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
351909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
352009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
352109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
352209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
352309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
352409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
352509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
352609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
352709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
352809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
352909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
353009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
353109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
353209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
353309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
353409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
353509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
353609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
353709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
35384a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
353909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
354009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
354109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
354209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
354309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
354409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3545a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3546a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3547a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3548cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
3549cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
3550cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3551cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
3552cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
3553cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3554cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3555cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
3556cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3557cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3558cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3559cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3560cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3561cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3562cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
3563cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
3564cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
3565cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3566c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
3567cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
3568cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3569cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3570cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
35719b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
3572cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3573cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3574cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3575cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3576cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3577cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3578cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3579cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3580cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3581cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3582cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3583cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3584cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3585c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
3586cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3587cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3588cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
3589cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3590cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3591cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
3592cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
3593cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3594cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3595cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3596cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3597cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3598cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
3599cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
3600cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
360298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
36040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3605df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3606df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3607df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3608df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3609df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3610df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3611df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
361242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
361336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
361957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3620dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3622d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3623be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3626b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36343af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36363af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3637df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
36387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
36394558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3640a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
36410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36447a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3646e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
364788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
36483af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
36493af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
36504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36560d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36580d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
365988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3660d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
36610d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3663b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
366413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
3665b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36729f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36760d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
367787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
367892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3679c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
3680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3683ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
368409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3697c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
3698cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
36990ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3703c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
3704c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
3705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3706cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
3707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37081d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
37091d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
371009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
371309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
371509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3732094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3736bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
3737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3738c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3739c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
3740c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_op2},
3741c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
3742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3743c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2},
3744c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
37459a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
3746c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
3747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3748c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
3749c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
3750c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
3751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3752c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2},
3753c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
3754c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
3755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3756c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3757c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
3758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3762cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3763cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3764cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3765cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3766cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3767cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3768cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3769cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3770cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3771cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3772cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3773cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
37749b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
37759b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
37766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
3777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
377950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
378050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
378198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
378250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
378350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
378450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
37858ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
378650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3787112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
378850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
378950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
379050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
379150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
379250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
379350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
379450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
379550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
379650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
379750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
379850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
379950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
380050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
380250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
380550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
380850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3810df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
381150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
381250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
381350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
381450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
381550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
381650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
381850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
382050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
382150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
382250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
382350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
382450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
383050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
383250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
383350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
383450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
383550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
383713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
383850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
383950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3852c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3870608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
3871cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3876cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
3877cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3879cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
38821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
38847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
39067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
39077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
39087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3909a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
39107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3911cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3912cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
3913cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
3914cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3916cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3917beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
3918cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
3919cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
39207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3921cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
3922cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
3923cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
39247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
3926cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
3927cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3929cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3930cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3935cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3936cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3937cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3938cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3939cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3940cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3941cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3942cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3943cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3944cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3945cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3946cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
39479b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
39489b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
39496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
39507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
39527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
39547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
39557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
39567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
39577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
39587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
39597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
39607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
39617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
39627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
39637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
39647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
39657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
39667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
39677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
39687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
39697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
39707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
39717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
39727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
39737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
39757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
39787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
39817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3983df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
39847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
39857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
39867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
39877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
39887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
39897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
39917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
39937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
39947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
39957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
39967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
39977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
39997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
40007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
40017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
40027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
40037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
40047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
40057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
40067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
40077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
40087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
40097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
401013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
40117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
40127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
401350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
401450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
401550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
401650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
401750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
401852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
401950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
402050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
402150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
402250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
402350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
402450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4025c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
402650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
402750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
402850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4029ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
403050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
403150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
403250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
403350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
403450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
403550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
403650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
403750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
403850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
403950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
404050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
404150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
404250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
404350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4044cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
40450ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
404650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
404750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
404850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
404950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
405050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
405150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4052cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
405350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
40541d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
40551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
405650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
405750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
405850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
405950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
406050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
406150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
406250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
406350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
406450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
406550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
406650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
406750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
406850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
406950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
407050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
407850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
407950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
408050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
408150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
408250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
408350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4084cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4085cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
408650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
408750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
408850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
408950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
409950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
410750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4108cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4109cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4110cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4111cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4112cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4113cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4114cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4115cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4116cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4117cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4118cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4119cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
41209b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, 0, tgsi_unsupported},
41219b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
412250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
412350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
4124