r600_shader.c revision 4f7c21899ad449be2bc1157ce1d2d99296a34499
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);
122052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
123eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	r = r600_shader_from_tgsi(rctx, shader);
1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1251235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1284a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_build(&shader->shader.bc);
1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1311235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
133052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
1344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_dump(&shader->shader.bc);
135052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
136052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
137afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse
14069251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
141ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
1426101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
1434a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_clear(&shader->shader.bc);
144eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
145eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	memset(&shader->shader,0,sizeof(struct r600_shader));
146ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
147ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1501235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
153a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
154a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
155a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
156a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
157a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
158a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
159a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
160a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
161a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1632b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1642b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1652b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1682b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
1692b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
1704a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode				*bc;
1712b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
17240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
173cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
174cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
175e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
176fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
177fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
178fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
179fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
180fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
1872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
1882b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
1892b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
1907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
19142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
205c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
206a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
211a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2138260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2148260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2158260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
22047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
22147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
228fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
22950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
23050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
2314a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
232fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
233fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
234fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
235fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
236fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
237fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
238fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
239fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
240fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
241fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
242fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
243fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
244fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
245fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
246fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
247fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
25550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
25650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
2574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
25950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
26050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
26150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
26250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
26350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
26450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
26650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
26750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
26850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
26950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
271fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
272fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
273fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
274fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
2794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
2847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
2857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
28621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
28721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
28821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
28921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
29021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
29121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
29221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
29421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0;
29521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
29621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
29721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
29821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
29921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
30021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
30121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
30221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
3127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3130a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
3140a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
3150a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3160a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
3170a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
3180a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
3190a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
3200a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3210a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
3220a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
3230a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
3240a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
3250a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
3260a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
3270a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
3280a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
3290a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
3300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3310a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
3455b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3465b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3475b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
3485b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
3495b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
3505b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
3515b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3525b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
3535b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
3545b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
3555b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
3565b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
3575b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
3585b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
3595b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
3605b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
3615b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
3625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
3635b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* FIXME: two-side rendering is broken in r600g, this will
3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			 * keep old functionality */
3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			if (name == TGSI_SEMANTIC_BCOLOR)
3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin				name = TGSI_SEMANTIC_COLOR;
3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
38472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
38796bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
38872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
3945b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
39535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
3968a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
397024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
39889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) {
39950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
4005b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			if (ctx->shader->input[i].spi_sid) {
40121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie				ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
40421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie				} else {
40521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie					evergreen_interp_flat(ctx, i);
406fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
40850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
4145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
415024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
41635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
42033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
42147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
42396bbc627f369c0100b950f81531b1fe9ef586c34Christian König
424c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
425c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
4264a47662beaa2092447939db7880531fb706afeddMarek Olšák			struct r600_bytecode_alu alu;
4274a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
42896bbc627f369c0100b950f81531b1fe9ef586c34Christian König
429c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
430c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
431c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
43296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
43396bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
43496bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
43596bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
436c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
43796bbc627f369c0100b950f81531b1fe9ef586c34Christian König
4384a47662beaa2092447939db7880531fb706afeddMarek Olšák			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
439c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
440c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
441c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		}
44296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
44872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
44972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
450be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
451be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
452be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
453be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
454be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
4557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
5021fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
5031fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
5041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
5051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
5061fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
5071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
5081fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
5091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
5101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
5111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
5121fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
51396bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
5151fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
5161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
5171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
5181fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
5191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
5201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
5214a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
5221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
5231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
5241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
5251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
5261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
5271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
52896bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
529c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		/* assume we wan't TGSI_SEMANTIC_INSTANCEID here */
530c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[0] = 3;
531c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[1] = 3;
532c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[2] = 3;
533c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[3] = 3;
534c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->sel = 0;
535c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
5361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
5371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
5381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
5391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
5401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
5411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
5421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
543077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
544077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
5454a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
546077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
547077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
548077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
549077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
5504a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
551077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
552077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
553077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
554077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5558e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
556077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
557077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
558077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
559077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
560077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
561077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
562077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
563077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5644a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
565077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
566077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
567077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
568077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
5698e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
570077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
571077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
572077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
573077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
574077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
575077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
576077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
577077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
578077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
579077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
580077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
581077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
582077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
583077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
584077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
585d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
586077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5874a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
588077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
589077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
590077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
591077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
592077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5964a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
5977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
5987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
6027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
6047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
606077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
607077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
608077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
609077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
610077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
611077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
612077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
613077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
614077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
615077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
616077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
617077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
618077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
6197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
6207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
6214a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
6227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
6237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
6247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
6257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
6267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
6277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
6287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
6297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
6307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
6314a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
6327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
6337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
6347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
6357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
6367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
6377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
6387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
6417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
6427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
6447687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
6457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
6467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6474a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
6487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
6497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
6517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
6527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
6537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
6567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
6577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
6587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
6594a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
6607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
6617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
6627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
6637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
6647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
6657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
6667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
6677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
6687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
6694a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
6707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
6717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
6727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
6737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
6747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
6757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
680eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader)
68172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
682eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
683eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct tgsi_token *tokens = pipeshader->tokens;
684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
6855555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
6874a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
690feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	int i, j, r = 0, pos0;
69172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
6944a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_init(ctx.bc, rctx->chip_class);
695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
700f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
702eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) ||
703eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color));
704eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
705feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
706feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
708076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
709076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
710076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
711f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
712f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
713f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
715076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
716076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
717076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
718076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
73389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
7344a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
735f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
7364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
737f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
73989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
740fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
74184457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
7434d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_INPUT] + 1;
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
7454d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
746d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
74797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
74897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
74997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
750d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
7517728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
7528e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
7534d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
7548e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
756cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
757cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
7585555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
764cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
765cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
766cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
767cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
768cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
769cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
770cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
771cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
772cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
773cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
784be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
785be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
786be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
7871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
7887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
7897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
7907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
7917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
7927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
79389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
7947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
79589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
79650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
79750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
79850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
803876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
8045555cd776b970bce020be59193054474a2a63317Dave Airlie			property = &ctx.parse.FullToken.FullProperty;
8055555cd776b970bce020be59193054474a2a63317Dave Airlie			if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
8065555cd776b970bce020be59193054474a2a63317Dave Airlie				if (property->u[0].Data == 1)
8075555cd776b970bce020be59193054474a2a63317Dave Airlie					shader->fs_write_all = TRUE;
8085555cd776b970bce020be59193054474a2a63317Dave Airlie			}
809876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
816eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
817457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
818eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
819eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* clamp color outputs */
820eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	if (shader->clamp_color) {
821eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		for (i = 0; i < noutput; i++) {
822eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			if (shader->output[i].name == TGSI_SEMANTIC_COLOR ||
823eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				shader->output[i].name == TGSI_SEMANTIC_BCOLOR) {
824eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
825eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				int j;
826eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				for (j = 0; j < 4; j++) {
8274a47662beaa2092447939db7880531fb706afeddMarek Olšák					struct r600_bytecode_alu alu;
8284a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
829eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
830eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					/* MOV_SAT R, R */
831eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
832eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.sel = shader->output[i].gpr;
833eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.chan = j;
834eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.write = 1;
835eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.clamp = 1;
836eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].sel = alu.dst.sel;
837eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].chan = j;
838eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
839eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (j == 3) {
840eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						alu.last = 1;
841eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					}
8424a47662beaa2092447939db7880531fb706afeddMarek Olšák					r = r600_bytecode_add_alu(ctx.bc, &alu);
843eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (r)
844eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						return r;
845eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				}
846eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			}
847eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		}
848eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	}
849eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
850eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
851feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	j = 0;
852457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
8534a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&output[i], 0, sizeof(struct r600_bytecode_output));
854feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].gpr = shader->output[i].gpr;
855feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].elem_size = 3;
856feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_x = 0;
857feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_y = 1;
858feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_z = 2;
859feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_w = 3;
860feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].burst_count = 1;
861feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].barrier = 1;
862feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
863feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].array_base = i - pos0;
864feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
865457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
868feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 60;
869feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
871457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
872457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
873457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
874feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
875feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
876457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
877457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
882feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = shader->output[i].sid;
883feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
8844f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
885feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					for (j = 1; j < shader->nr_cbufs; j++) {
8864a47662beaa2092447939db7880531fb706afeddMarek Olšák						memset(&output[i + j], 0, sizeof(struct r600_bytecode_output));
887feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].gpr = shader->output[i].gpr;
888feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].elem_size = 3;
889feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_x = 0;
890feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_y = 1;
891feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_z = 2;
892feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_w = 3;
893feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].burst_count = 1;
894feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].barrier = 1;
895feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].array_base = shader->output[i].sid + j;
896feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
897feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
898feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
89960302f83e2344195f9a1c37215def09fa9c45ff9Marek Olšák					j = shader->nr_cbufs-1;
900feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
9015f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
902feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
903feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 2;
904feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 7;
905feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
906feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
90739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
908feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
909feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 7;
910feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 1;
911feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
912feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
92372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
924457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
925feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	noutput += j;
926457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
927457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
928457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
929457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
930457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
931457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
932457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
933457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
934457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
9354a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&output[i], 0, sizeof(struct r600_bytecode_output));
936457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
937457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
938a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_x = 7;
939a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_y = 7;
940a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_z = 7;
941a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_w = 7;
9428ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
943457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
944457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
945457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
9467e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
947457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
949c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
950481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
951481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
9524a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&output[0], 0, sizeof(struct r600_bytecode_output));
953481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
954481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
955481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
956481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
957481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
958481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
9598ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
960481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
961608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
962481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
963a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
964481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
965481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
966457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
967457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
96889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
9697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
9707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
9717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
972457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
973b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
974b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
975a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
976c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
977c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
978457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
979457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
9804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
9847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
98589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
9864a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
9877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9883b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
992cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
994de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
997de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
999f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1000f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
10094a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1010a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1011a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1012a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1013a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1014a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1015a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1016a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1017a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1018a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1019a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1020a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
10214a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1022f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1023f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1024f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1025f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1026f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
10274a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
10283efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
10293efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
10303efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
10313efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
103280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
103380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
103480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
10354a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
10377a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10387a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1040de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
104347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
104447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
10457a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
10467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
10477a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1050dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1052dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1053d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1054d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1055dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1056d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1057d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1058d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1059dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1060dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1061dffad730df17983cfaef0808555a8c26cad0aa15Christian König
10629b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1063dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1064dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1066dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1067dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1069d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1070d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1071d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1072d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
10734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
107480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1076d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1077d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
10794a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1081d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
10824a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
10834a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
10884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
10907a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
10914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
10927a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
10969b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
10994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1106d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1107d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
11089b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1109d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1110d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1111d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1112d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
11139b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
11149b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
11159b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
11169b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
11179b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
11189b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1119d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1120d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1121cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1122cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1123cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1124cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1125cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1126cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1127cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1128cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1129cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1130cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1131cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1132cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1133cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1134cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1135cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1136cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1137cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1138cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1139cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1140cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1141cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1142cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1143cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1144cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1145cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1146cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1147cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1148cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1149cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1150cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1151cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
11527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
11537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
11547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
11564a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
11577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
11587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
11604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
11617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
11627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
11634a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
11647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
11657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
11677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
11697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
11704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
11717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
11727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
11737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
11747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
11757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
11767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11777ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
117888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
117988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
118188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
11821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
118388f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
118496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
118596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
118696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
118796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
118896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
11894a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
11907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
11914a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1192a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
119388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
119488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
119588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
119788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
119888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
11994a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
12007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1201921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
120288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1203a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
120496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1205ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
120688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
12074a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
120888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
120988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
121088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
12114a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1212a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
12137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
121488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
121588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
121688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
121788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
121888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
121988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
122088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
12214a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
122288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
122388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
122488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
12254a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1226a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
122788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
122888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
122988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
123088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
123188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
123288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
123388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
123488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
12357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1236921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
123788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1238921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1239ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
124096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
124189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1242a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1243a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
124496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
124596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
124696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
124796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
124896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
124996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
125088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
12514a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
125288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
125388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
125492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
125592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
125692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
12577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
12587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
12597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12604a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
12617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
12627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
12637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
12657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
12667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
12677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
12704a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
12727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
12737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
12767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
12787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
12797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
12807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
12814a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
12827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
12837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
12847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
12857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
12867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
12877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
128892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
128992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
129092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12914a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
129292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1293dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
129492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
12951fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
129692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
129792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
129888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
12994a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
130088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
130188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
130288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
130388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
130488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
130588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
130688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
130788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
13084a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
130988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
131088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
131188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
131288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1313be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1314be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1315be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1316be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
13174a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1318a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1319be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1320be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
132180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1322be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
132388f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
13244a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
132588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
132688f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
132788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
132888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
132988f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
133088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
133192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
133292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
133392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13344a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
13357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
133692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
133757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
133857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
133957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
134057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
13411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
134257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
134357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
134457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
134592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
134692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
134757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
134889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
13504a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
13557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
13567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
13577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
13597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
13607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
13617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13624a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
13637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
13674a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
13697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
137092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
13717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
13727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
13737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13744a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
13757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
13767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
13777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
137857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
137992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
138092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
138157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
138289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
13837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
13844a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
13867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
13887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
13907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
13927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
13937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
13947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13954a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
13967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
14004a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
14027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
140357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
14047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
14057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
14067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
14087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
141157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
141292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1413ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1414ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
14154a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1416ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1417ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1418ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
141980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1420ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1421ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1422ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1423ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1424ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1425ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
14264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1427ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1428ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1429ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1430ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1431ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1432ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
14334a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1434ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1435ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1436ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
143780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1438ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1439ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1440ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1441ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1442ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1443ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
14444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1445ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1446ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1447ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1448ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
144992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
145092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
145192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1452094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1453094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
14544a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1455094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1456094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1457094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
14584a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1459094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
14604502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1461094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
14624502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1463921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
14644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
14654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
14664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
14674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
14684502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
14694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
14704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1471094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1472094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1473094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
14744a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1475094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1476094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1477094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
14784502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
14794502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
14804502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
14814502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1482094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1483094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1484094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
14850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
14860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
14870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14884a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
14900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1491f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
14924a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1493f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
14944a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
1495f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1496f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
1497f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1498f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
1499f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
1500f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
1501f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1502f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
15034a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1504f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
1505f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
1506f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
15070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
15080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
15096a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
15106a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
15126a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
151389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
1515f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
15164a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1518f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
1519f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
1520f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
1521f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
15227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
1533f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
15344a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1536f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
1537f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
15382fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
15392fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
15402fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
15417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15424a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
15460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
15476a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
15486a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
15490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
155086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
15514a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1552a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
155386f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
155486f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
15554a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
15564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
15570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
15580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
15590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
15600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
15610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
15624a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
15630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
15640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
15650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
156689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
15677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
15687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
15694a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
15717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
15727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
15737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
15757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
15767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
15777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
15787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
15794a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
15807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
15817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
15827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
15837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
15847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
15854a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
15877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
15887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
15897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
15907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
15927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
15937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
15947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
15950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1596abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
15978567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
15984a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15998567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
16008567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
16018567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
16028567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
16038567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
16044a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
16058567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
16068567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
16078567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
1608abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
16094a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1610abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
16114a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1612abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1613abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1614abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1615abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
16164a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1617abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1618abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1619abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1620abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
16214a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1622abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1623abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1624abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1625abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1626abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1627abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
16284a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1629abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1630abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1631abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
16320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
16330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
16340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
163542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
163642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
163742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
163942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
164042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
16414a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1642df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1643df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1644df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1645df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1646df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1647df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1648df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
164942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
16504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
16514a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
165242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
165342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
165442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
165542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
16564a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
165742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
165842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
165942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
166042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
166142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
166242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1663a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
16647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
16657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16664a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1667a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
16687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
16697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
16704a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1672a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
16737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
167480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
16767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
16777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
16784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
16797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
16807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
16817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
16827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
16837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
16847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1685a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1686a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1687a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16884a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1689a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1690a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
16914a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1692a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1693a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
16944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
1695a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1696a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1697a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1698a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
16994a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1700a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1701a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1702a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1703a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1704a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1705a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
17067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
17077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
17087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
17104a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
17117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
17127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
17144a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
17164a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
17177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
17187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
17197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
17207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
17217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
17224a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
17247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
17257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
17267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
17284a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
17304a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
17317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
17327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
17337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
17347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
17354a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
17367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
17377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
17387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
17407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
17414a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
17437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
17447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
17477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
17487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
17494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
17517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
17527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
17537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
17547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
17557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1756a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1757a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
17584a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1759a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1760a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1761a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
17624a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1763a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
17644a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1765a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1766a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1767a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
17684a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1769a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1770a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1771a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
17724a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
177366f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
17744a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
1775a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1776a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1777a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1778a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
17794a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1780a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1781a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1782a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
17834a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1784a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1785a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1786a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1787a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1788a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
17894a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1790a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1791a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1792a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1793a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1794a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
17950d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
17960d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
17970d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17984a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1799921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
18000d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18010d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
18020d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
18034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1804a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
18050d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1806cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
18070d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1808cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
18090d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
1811921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
18124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
18130d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
18150d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
18164a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18170d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
18180d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
18190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
18200d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18210d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
18220d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
18234a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1824a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
18250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
182680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18270d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18280d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1829cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
18300d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
18310d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1832921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
18330d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
18340d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1836cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
18370d48925a56ad4fb253386110b545abda82a25464Dave Airlie
18380d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
18390d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
18404a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18410d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
18420d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
18430d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
18440d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
18450d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
18460d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1847cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1848cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
18494a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1850cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1851cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1852cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
18534a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1854cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1855a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
18566c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1857cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1858a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
185980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1860cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1861cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1862cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1863cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1864cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1865cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
18664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1867cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1868cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1869cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1870cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1871cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1872cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18764a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1878dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
18807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
18817be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
18827be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
18837be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
18844a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18897be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
189080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1892cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
18947be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18974a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
19017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1902cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1903cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1904cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1905cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1906cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19074a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1908cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1909cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
19114a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1912cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1913cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
19144a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1915cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1916a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
191780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1918cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1919a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1920cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1921cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1923cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1924921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1925cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1926cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1927cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1928cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1929cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1930921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1934e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1935e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1936e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1937e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1938e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1939e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1940e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1941cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
19474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
19517be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
19546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
19556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
19566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
19576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
19596415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
19606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
19616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
19626415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
19636415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
19646415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
19656415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
19666415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19676415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
19686415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
19696415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
197033241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
197133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
197296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
197333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
19754a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1976641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
197740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1979da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
1980da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
19816415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
198278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
198313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
19841d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	u8 offset_x = 0, offset_y = 0, offset_z = 0;
1985641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
19866415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
1987641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
19881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
19891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
19901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
19911d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
19921d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
19931d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
19941d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
19951d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
19961d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
19971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
199813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
199913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
200013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
200140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
200240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
20034a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
200440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
200540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
200640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
200740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
200840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
200940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
201040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
201140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
201240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
201340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
201440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
201540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
201640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
20174a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
201840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
20194a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
202040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
202140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
202240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
202340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
202440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
20254a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
202640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
202740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
202840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
202913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
203040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
203140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
203240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
203340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
203440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
203540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
203640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
203740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
203840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
203940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
204040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
204140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
204240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
204340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
204440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
204540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
20464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
204740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
204840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
204913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
205013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
20517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
2052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
205389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
20557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
20564a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20584a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
2059bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
20607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
20617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
20627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
20657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20664a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
20734a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20754a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
20767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
20787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
20797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
20814a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
20827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
20847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
20859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
2086b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
20874a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2088a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2089b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
20914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2092b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2093b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2094b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
20954a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2096b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2097b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2098b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
20994a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2100a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2101921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2102b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
2103b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
2104b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
2105b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
2106b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
21074a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2108b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
2109b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
211078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2111b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2112bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2113bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2114bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
21150e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
21160e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
2117bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2118bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
2119bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
21204a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2121a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
21224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
21234a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
2124bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
2125bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
2126bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
2127bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
2128bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
21294a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
2131bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
2132bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
2133bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2134bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
213589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
21374a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
21397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
21417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
21427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
21447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21484a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21534a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
21557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
21577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
21587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
21597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
21607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
21617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21624a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
21667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2167bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
2168bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
21697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
2170bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
21714a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2172a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2173bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2174bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2175bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2176bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
2177bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2178bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
21797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2180bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2181bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2182a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2183bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2184bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2185bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
2186bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2187bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
21884a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2189bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2190bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2191bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
21924a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2193a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2194bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2195bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2196bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2197bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
2198bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2199bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
22007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2201bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2202bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2203a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2204bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2205bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2206bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
2207bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2208bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2209bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
22104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2211bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2212bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2213bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
221478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2215bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
2216bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2217bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
221878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
2219b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
22204a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2221a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
22224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2223b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2224b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2225b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
2226b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
2227b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
22284a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2229b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2230b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2231b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
223278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2233b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2234b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
22357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2236bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2237929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
2238929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
22396b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
2240929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
2241929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
2242de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
2243de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
2244de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
2245de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2246de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
2247de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
2248de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2249c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
2250c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
2251c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
2252de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
2253de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
2254de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2255de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
2256de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
225733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
22584a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
2259bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
22606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
22616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
2262077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
2263641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
22646c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
22659d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
22669d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
22679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
22689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
226978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
227078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
227178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
227278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
227378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
227478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
227578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
227678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
227778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
227878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
2279244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
228078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
22819a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2282bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2283bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2284bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2285bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2286bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2287bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2288bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
22896b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
22906b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
229101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
229201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
229301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
22946b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
22956b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
2296bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
22971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
22981d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
22991d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
230069d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2301929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
2302929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
2303929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
2304929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
2305929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
23066b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
2307929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
2308929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
2309929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
231078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2311929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
2312929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
2313929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
2314929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
2315929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
2316929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
2317929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
2318929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
2319929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
2320929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
2321929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
2322929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
2323929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
2324929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
2325929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
2326929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
2327929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
2328bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
23294a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
2330bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2331bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2332bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2333bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2334bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
233533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
233633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2337b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2338b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2339b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23404a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2341dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2342b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2343b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2344b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2345c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
23461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2347c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2348c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2349c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2350c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
23514a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2352c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
23534a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
23544a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2355c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
235680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2357c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2358c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2359c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2360c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
23614a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2362c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2363c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2364c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2365c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2366c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2367c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2368b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2369dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2370dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2371dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2372dffad730df17983cfaef0808555a8c26cad0aa15Christian König
23734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2374a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2375921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2376b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
23774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
23784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
2379b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2380b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2381dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2382b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2383b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2384b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
23854a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2386b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2387b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2388b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2389b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2390b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2391dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2392dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2393dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2394dffad730df17983cfaef0808555a8c26cad0aa15Christian König
23954a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2396a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2397b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2398b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
23994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2400b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2401b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2402dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2403b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2404b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2405b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
24064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2407b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2408b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2410b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2411b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2412dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2413dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2414dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2415dffad730df17983cfaef0808555a8c26cad0aa15Christian König
24164a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2417a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2418b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
24194a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
24204a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2421b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2422b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2423dffad730df17983cfaef0808555a8c26cad0aa15Christian König
242480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2426dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2427b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
24294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2431b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2432b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2433dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2434b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2435b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
243687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
243787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
243887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24394a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
244087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2441dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
244287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
24437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
24447be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
24457be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
244687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
24474a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2448a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
24494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
24504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
24514a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
245280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
245387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
245487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
245587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
24567be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
245787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
24584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
245987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
246087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
24617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
246287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
246387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
246487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
24650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
24660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
24670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24680e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
24690e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
24704a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
24710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
24720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
24730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
24750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
24760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
24784a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2479a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24800e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
24814a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
24824a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
24830e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
24840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
24850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
24860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
24870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
24880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
24890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
24910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
24920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
24930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
24950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
24964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
24980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
24990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
25000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
25024a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2503a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
25040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25050e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
25064a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
25074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
25080e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
25090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
25100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
25110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
25120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
25130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
25140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
25160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
25170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
25180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
25190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
25200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
252180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
252280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
25230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
25240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
25250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
25260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
25270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
25284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
25290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
25300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
25310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
25320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
25330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
25340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
25350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
25360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
253736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
253836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
253936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
25404a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
254109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
25427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
254336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
254436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
254536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
25464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
254736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2548a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
25494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
255036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
255136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
255236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
255336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
255436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
25554a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
255636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
255736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
255836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
255989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
25607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
25637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
256436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
25657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
25687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
25714a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
25727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
25787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
25797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
25827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
25844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
25857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
258836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
25897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
259036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
259136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
25924a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
259336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2594a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
25954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
259636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
259736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2598b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2599b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2600b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2601b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2602b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
260336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
260436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
260536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
260636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
260736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
26084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
260936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
261036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
261136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
261236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
261336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
261436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
261589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
26167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26174a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
26194a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
262036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
26217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
26247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
26267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
262736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
26284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
26297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
26327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26334a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
26354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
263636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
26377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
26407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
26427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26434a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
26447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
264736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
264836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
264936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
265036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
26514a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
265236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2653a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
265436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
265536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
265636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
265736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
265836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
265936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
266036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
26614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
266236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
266336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
266436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
266536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
266636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
266787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2669460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2670460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
26714a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2672460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
26737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2674460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2675f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
2676460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
267789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
26787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26794a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2680460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
26824a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
26834a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
26847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
26887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
26914a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
26927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2695460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26974a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27014a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
27027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
27057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
27067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
27074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
27087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
27097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
27107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2711460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2712460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2713460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2714460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2715460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2716460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2717460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2718460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2719460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2720460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2722460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2723460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2724460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2725460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2726f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
2727460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2728460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
272989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27314a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
273296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27344a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27354a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
273696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
27407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
27437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27444a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
27487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27494a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27534a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
27547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
27577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
27587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27604a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
27617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
27627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
27637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
276496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27654a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
276696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
276796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
276896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
276996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
277096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
277196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
277296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
277396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
277496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
277596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
277796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
277896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
277996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
278089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27824a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
27847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
27857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
27867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
27907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
279396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27944a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
27987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27994a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
28017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
28027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
280396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
28057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
28067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
28077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
280896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28094a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
28107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
28117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
28127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
281396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
281489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
28157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
28164a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
28187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
28197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
28207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
28227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
28237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
28247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
28257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
28267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
28277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
28297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
28307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
28317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
28327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
28334a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
28357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
28367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
283796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
28397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
28407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
28417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
284296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28434a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
28447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
28457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
28467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
284796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28484a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
284996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
285096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
285196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
28524a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
28534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
285496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
285596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
285696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2857460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2858460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2859460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2860460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2861460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2862460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28634a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2864460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2865460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2866460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2867460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2868f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
2869460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 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]);
2877460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
28797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
28807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
28817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
28827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
28837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
2884460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28854a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
28867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
28877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
28887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
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.write = 1;
28987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
28997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
29007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
29014a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
29027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
29037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
29047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2905460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2906460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2907460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2908460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
29094a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2910460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2911460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2912460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2913460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2914460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2915460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2916460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2917460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2918460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2919460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
29204a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2921460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2922460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2923460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2924460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2925460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2926460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2927460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
292898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
292998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
293098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29314a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
293298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
2933a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
29344a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
293598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
293652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
293752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
293852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
293952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
294052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
294152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
294252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
29439b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
29448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
29459b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
294652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
294752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
294852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
294952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
295052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
29518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
295298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
29538e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
29548e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
29554a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
295698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
295798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
29588e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
29598e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
296098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
296198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
296298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
296347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
296447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
296647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
2967a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
29687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
29697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
2970077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2971077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
29724a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
29738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
2974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2976077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
29774a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
2979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2981077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
29828e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
29838e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
2984077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
29874a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
29897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
29907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
2991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2992077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
29934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
29948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
2995077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2997077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
29984a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
30007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
30019b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
30028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
30038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
30048e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
30058e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
30068e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
30078e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
30088e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
30098e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30108e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
30119b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
30127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
30137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
30147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
30157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
30167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
30178e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
301847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
301947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
302047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
302157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
302257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
302357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30244a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
302557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
302657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
302757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
30284a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
302957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3030a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
303180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
30327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
30337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
303457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
303557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
30364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
303757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
303857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3039a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
304057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
304157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
30424a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
304357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
304457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
304557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
30464a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
304757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
304857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
304957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
305057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
305157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
305257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
3053a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
3054a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
30554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
3057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
30584a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3059a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
3060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
3061a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3062a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
3063a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
3064a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
3065a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
30664a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
3067a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
3068a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
30697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3070a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
3071a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
30724a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
3073a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
3074a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
3075a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3076a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3077a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3078a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
3079a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
30802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
30812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
30822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
30832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
30842bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
30854f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
30862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
30874f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
30882bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
30892bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
30902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
30912bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
30924f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
30932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
30942bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
30954f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
30962bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
30972bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
30982bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
30992bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
31002bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
31012bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
31022bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
31034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
31048813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
31058813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
31068813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
31072bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
3108a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3109a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3110a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
311109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
3112a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
311309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
311409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
311509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
311609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
311709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
311809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
311909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
312009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
312109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
312209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
312309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
312409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
312509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
312609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3127a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
312809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
312909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
313009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
313109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
313209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
313309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
313409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
313509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
313609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
313709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
313809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
3139a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
3140a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
3141a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
314309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
314409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
314509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
314609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
314709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
314809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
31497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
315009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
315109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
315209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
315309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
315409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
315509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
315609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
315709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
315809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
315909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
316009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
316109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
316209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
316309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
316409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
316509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
316609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
316709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
316909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
317009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
317209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
317309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
31744a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
31754a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
317609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
317709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
317809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3179a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
318009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
318109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3182a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
318309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
318409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
318509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
318609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
318709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
318809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
318909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
319009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
319109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
319209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
319309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
319409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
319509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
319609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
319709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
319809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
319909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
320009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
320109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
320209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
32034f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
320409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
320509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
320609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
320709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
320809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
320909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
32104f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
321109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
321309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
321409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3215a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
321609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
321809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
321909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
322009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
322109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
322209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
32237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
322409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
322509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
322609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
322709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
322809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
322909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
323009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
323109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
323209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
323309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
323409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
323509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
323609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
323709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
323809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
32394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
324009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
324109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
324209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
324309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
324409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
324509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
324609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
324709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
324809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
324909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
32508b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
325109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
32524a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
325309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
325409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
325509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
325609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
3257a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3258a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3259a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3260a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
3261a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
32624a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
3263a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
3264a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
326509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
3266a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
3267a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3268a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3269a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3270a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
3271a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
3272a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
3273a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
3274a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
3275a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
3276a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
3277a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3278a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
3279a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
3280a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
3281a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
328209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
3283a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
328409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
328509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
328609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
328709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
328809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
328909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
329009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
329109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
32924a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
329309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
329409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
3295a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
329609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
329709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
329809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
329909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
330009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
330109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
330209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
330309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
330409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
33054a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
330609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
330709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
330809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
330909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
331009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
331109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
331209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
331309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
331409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
331509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
331609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
331809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
331909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
332009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
332109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
332309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
332409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
332509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
332609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
332709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
332809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
332909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
333009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
333109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
333209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
333309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
333409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
333509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
333609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
333709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
333809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
333909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
334009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
334109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
334209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
334309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
334409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
33454a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
334609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
334709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
334809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
334909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
335009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
335109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3352a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3353a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3354a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3355cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
3356cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
3357cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3358cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
3359cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
3360cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3361cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3362cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
3363cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3364cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3365cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3366cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3367cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3368cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3369cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
3370cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
3371cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
3372cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3373c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
3374cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
3375cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3376cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3377cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
33789b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
3379cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3380cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3381cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3382cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3383cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3384cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3385cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3386cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3387cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3388cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3389cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3390cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3391cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3392c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
3393cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3394cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3395cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
3396cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3397cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3398cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
3399cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
3400cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3401cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3402cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3403cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3404cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3405cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
3406cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
3407cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
340998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
34110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3412df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3413df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3414df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3415df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3416df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3417df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3418df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
341942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
342036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3421460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3424cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3425cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
342657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3427dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3429d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3430be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3433b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34413af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34433af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3444df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
34457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
34464558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
34480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34517a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3453e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
345488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
34553af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
34563af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
34574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34630d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34650d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
346688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3467d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
34680d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3470b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
347113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
3472b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34799f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34830d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
348487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
348592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3486c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
3487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3489cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3490ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
349109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3492a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3496a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3497a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3504c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
3505cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
35060ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3510c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
3511c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
3512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3513cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
3514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35151d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
35161d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
351709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
352209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3539094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3543c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
3544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3545c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3546c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
3547c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_op2},
3548c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
3549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3550c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2},
3551c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
3552c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
3553c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
3554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3555c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
3556c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
3557c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
3558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3559c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2},
3560c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
3561c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
3562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3563c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3564c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
3565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3569cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3570cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3571cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3572cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3573cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3574cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3575cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3576cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3577cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3578cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3579cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3580cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
35819b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
35829b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
3583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
358550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
358650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
358798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
358850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
358950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
359050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
35918ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
359250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3593112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
359450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
359550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
359650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
359750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
359850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
359950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
360050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
360150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
360250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
360350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
360450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
360550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
360650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
360750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
360850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
360950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
361150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
361450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3616df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
361750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
361850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
361950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
362050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
362150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
362250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
362350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
362450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
362550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
362650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
362750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
362850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
362950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
363050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
363650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
363850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
363950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
364050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
364150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
364313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
364450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
364550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
36527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
36567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
36577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3658c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
36597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
36627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
36637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
36647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
36657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
36697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
36707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3676608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
3677cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
36787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
36797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3682cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
3683cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
36847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3685cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
36867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
36881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
36907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
36937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
36957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
37127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3715cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
37167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3717cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3718cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
3719cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
3720cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
37217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3722cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
37237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3724cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
3725cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
37267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3727cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
3728cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
3729cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
37307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
3732cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
3733cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3735cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3736cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
37377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3741cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3742cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3743cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3744cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3745cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3746cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3747cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3748cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3749cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3750cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3751cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3752cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
37539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
37549b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
37627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
37637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
37647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
37667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
37677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
37687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
37697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
37717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
37727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
37787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3788df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
37927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
37937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
37987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
37997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
38007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
38017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
38027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
38087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
38107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
38117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
38127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
38137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
381513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
38167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
38177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
382450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
382850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
382950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3830c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
383150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3834ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
383550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
383650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
383750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
383850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
384050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
384150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
384250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
384350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
384450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
384550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
384650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
384750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
384850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
38500ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
385150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
385250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
385350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
385450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
385550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
385650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3857cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
385850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
38591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
38601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
386150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
386250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
386350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
386450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
386550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
386650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
386750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
386850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
386950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
387550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
387950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
388050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
388150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
388250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
388350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
388450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
388550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
388650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
388750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
388850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3889cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3890cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
389150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
389950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
390950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
391250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3913cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3914cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3915cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3916cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3917cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3918cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3919cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3920cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3921cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3922cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3923cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3924cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
39259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, 0, tgsi_unsupported},
39269b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
392750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
392850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3929