r600_shader.c revision e42df8e10a83e76565474f82330d34403da71b49
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 "r600_sq.h"
24ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "r600_llvm.h"
25077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h"
26a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h"
2772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
28330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák
29ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "pipe/p_shader_tokens.h"
30330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_info.h"
31330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_parse.h"
32330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_scan.h"
33330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_dump.h"
34ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "util/u_memory.h"
35ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#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{
62e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_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		}
740a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák		ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->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		}
820a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák		rctx->ws->buffer_unmap(shader->bo->cs_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
106e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_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;
111e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse
114c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
118052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
121eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		tgsi_dump(shader->tokens, 0);
122543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
123543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		if (shader->so.num_outputs) {
124543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			unsigned i;
125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			fprintf(stderr, "STREAMOUT\n");
126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			for (i = 0; i < shader->so.num_outputs; i++) {
1272449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				unsigned mask = ((1 << shader->so.output[i].num_components) - 1) <<
1282449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák						shader->so.output[i].start_component;
129543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				fprintf(stderr, "  %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i,
130543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					shader->so.output[i].output_buffer, shader->so.output[i].register_index,
1312449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        mask & 1 ? "x" : "_",
1322449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 1) & 1 ? "y" : "_",
1332449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 2) & 1 ? "z" : "_",
1342449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 3) & 1 ? "w" : "_");
135543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
136543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
138eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	r = r600_shader_from_tgsi(rctx, shader);
1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1434a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_build(&shader->shader.bc);
1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
148052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
1494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_dump(&shader->shader.bc);
150052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
152afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15569251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
156ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
1576101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
1584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_clear(&shader->shader.bc);
159eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
160eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	memset(&shader->shader,0,sizeof(struct r600_shader));
161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
18578293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	struct r600_bytecode			*bc;
1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
18740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
18878293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				*literals;
18978293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				nliterals;
19078293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				max_driver_temp_used;
191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
196725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					face_gpr;
197725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					colors_used;
19854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	boolean                 clip_vertex_write;
19954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	unsigned                cv_output;
200c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	int					fragcoord_input;
201951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin	int					native_integers;
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2102b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
21242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
213ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only);
214ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type);
215ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_else(struct r600_shader_ctx *ctx);
216ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endif(struct r600_shader_ctx *ctx);
217ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx);
218ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endloop(struct r600_shader_ctx *ctx);
219ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx);
220ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
221ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/*
222ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * bytestream -> r600 shader
223ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard *
224ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * These functions are used to transform the output of the LLVM backend into
225ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * struct r600_bytecode.
226ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard */
227ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
228ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_src_from_byte_stream(unsigned char * bytes,
229ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx)
230ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
231ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned i;
232ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned sel0, sel1;
233ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel0 = bytes[bytes_read++];
234ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel1 = bytes[bytes_read++];
235ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].sel = sel0 | (sel1 << 8);
236ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].chan = bytes[bytes_read++];
237ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].neg = bytes[bytes_read++];
238ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].abs = bytes[bytes_read++];
239ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].rel = bytes[bytes_read++];
240ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].kc_bank = bytes[bytes_read++];
241ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for (i = 0; i < 4; i++) {
242ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8);
243ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
244ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
245ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
246ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
247ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx,
248ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
249ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
250ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned src_idx;
251ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst0, inst1;
252ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
253ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
254ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for(src_idx = 0; src_idx < 3; src_idx++) {
255ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		bytes_read = r600_src_from_byte_stream(bytes, bytes_read,
256ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								&alu, src_idx);
257ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
258ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
259ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.sel = bytes[bytes_read++];
260ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.chan = bytes[bytes_read++];
261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.clamp = bytes[bytes_read++];
262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.write = bytes[bytes_read++];
263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.rel = bytes[bytes_read++];
264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst0 = bytes[bytes_read++];
265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst1 = bytes[bytes_read++];
266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.inst = inst0 | (inst1 << 8);
267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.last = bytes[bytes_read++];
268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.is_op3 = bytes[bytes_read++];
269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.predicate = bytes[bytes_read++];
270ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle = bytes[bytes_read++];
271ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle_force = bytes[bytes_read++];
272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.omod = bytes[bytes_read++];
273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.index_mode = bytes[bytes_read++];
274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_alu(ctx->bc, &alu);
275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* XXX: Handle other KILL instructions */
277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) {
278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->shader->uses_kill = 1;
279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		/* XXX: This should be enforced in the LLVM backend. */
280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->bc->force_add_cf = 1;
281ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
282ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
283ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
284ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
285ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu,
286ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned pred_inst)
287ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
288ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->inst = pred_inst;
289ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->predicate = 1;
290ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].sel = V_SQ_ALU_SRC_0;
291ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].chan = 0;
292ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->last = 1;
293ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_alu_type(ctx->bc, alu,
294ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
295ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
296ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	fc_pushlevel(ctx, FC_IF);
298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			struct r600_bytecode_alu *alu, unsigned compare_opcode)
303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned opcode = TGSI_OPCODE_BRK;
305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (ctx->bc->chip_class == CAYMAN)
306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else if (ctx->bc->chip_class >= EVERGREEN)
308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else
310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	llvm_if(ctx, alu, compare_opcode);
312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_loop_brk_cont(ctx);
313ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_endif(ctx);
314ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
315ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
320ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst;
321ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
322ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0);
323ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst = bytes[bytes_read++];
324ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	switch (inst) {
325ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 0:
326ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		llvm_if(ctx, &alu,
327ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
328ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
329ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 1:
330ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_else(ctx);
331ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
332ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 2:
333ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_endif(ctx);
334ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
335ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 3:
336ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_bgnloop(ctx);
337ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
338ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 4:
339ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_endloop(ctx);
340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 5:
342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE));
344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 6:
346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 7:
350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		{
351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			unsigned opcode = TGSI_OPCODE_CONT;
352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (ctx->bc->chip_class == CAYMAN) {
353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&cm_shader_tgsi_instruction[opcode];
355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else if (ctx->bc->chip_class >= EVERGREEN) {
356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&eg_shader_tgsi_instruction[opcode];
358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else {
359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&r600_shader_tgsi_instruction[opcode];
361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			tgsi_loop_brk_cont(ctx);
363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
371ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_tex tex;
374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.inst = bytes[bytes_read++];
376ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.resource_id = bytes[bytes_read++];
377ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_gpr = bytes[bytes_read++];
378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_rel = bytes[bytes_read++];
379ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_gpr = bytes[bytes_read++];
380ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_rel = bytes[bytes_read++];
381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_x = bytes[bytes_read++];
382ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_y = bytes[bytes_read++];
383ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_z = bytes[bytes_read++];
384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_w = bytes[bytes_read++];
385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.lod_bias = bytes[bytes_read++];
386ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_x = bytes[bytes_read++];
387ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_y = bytes[bytes_read++];
388ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_z = bytes[bytes_read++];
389ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_w = bytes[bytes_read++];
390ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_x = bytes[bytes_read++];
391ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_y = bytes[bytes_read++];
392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_z = bytes[bytes_read++];
393ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.sampler_id = bytes[bytes_read++];
394ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_x = bytes[bytes_read++];
395ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_y = bytes[bytes_read++];
396ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_z = bytes[bytes_read++];
397ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_w = bytes[bytes_read++];
398ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
399ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_tex(ctx->bc, &tex);
400ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
402ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
404e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
405e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	unsigned char * bytes, unsigned bytes_read)
406e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{
407e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	struct r600_bytecode_vtx vtx;
408e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	memset(&vtx, 0, sizeof(vtx));
409e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.inst = bytes[bytes_read++];
410e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.fetch_type = bytes[bytes_read++];
411e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.buffer_id = bytes[bytes_read++];
412e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.src_gpr = bytes[bytes_read++];
413e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.src_sel_x = bytes[bytes_read++];
414e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.mega_fetch_count = bytes[bytes_read++];
415e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_gpr = bytes[bytes_read++];
416e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_x = bytes[bytes_read++];
417e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_y = bytes[bytes_read++];
418e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_z = bytes[bytes_read++];
419e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_w = bytes[bytes_read++];
420e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.use_const_fields = bytes[bytes_read++];
421e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.data_format = bytes[bytes_read++];
422e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.num_format_all = bytes[bytes_read++];
423e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.format_comp_all = bytes[bytes_read++];
424e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.srf_mode_all = bytes[bytes_read++];
425e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.offset = bytes[bytes_read++];
426e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.endian = bytes[bytes_read++];
427e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
428e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
429e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		fprintf(stderr, "Error adding vtx\n");
430e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	}
431e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	/* Use the Texture Cache */
432e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
433e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	return bytes_read;
434e42df8e10a83e76565474f82330d34403da71b49Tom Stellard}
435e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes,	unsigned num_bytes)
438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned bytes_read = 0;
4406f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard	unsigned i, byte;
441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	while (bytes_read < num_bytes) {
442ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		char inst_type = bytes[bytes_read++];
443ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		switch (inst_type) {
444ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 0:
445ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_alu_from_byte_stream(ctx, bytes,
446ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
447ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
448ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 1:
449ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_tex_from_byte_stream(ctx, bytes,
450ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
451ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
452ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 2:
453ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_fc_from_byte_stream(ctx, bytes,
454ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
455ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
4566f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard		case 3:
4576f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
4586f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			for (i = 0; i < 2; i++) {
4596f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				for (byte = 0 ; byte < 4; byte++) {
4606f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					ctx->bc->cf_last->isa[i] |=
4616f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					(bytes[bytes_read++] << (byte * 8));
4626f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				}
4636f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			}
4646f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			break;
465e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
466e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		case 4:
467e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
468e42df8e10a83e76565474f82330d34403da71b49Tom Stellard								bytes_read);
469e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			break;
470ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		default:
471ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			/* XXX: Error here */
472ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
473ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
474ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
475ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
476ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
477ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/
478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
48772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
491c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
492a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
49672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
497a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
4998260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
5008260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
5018260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
50647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
50747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
51272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
51372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
514fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
51550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
51650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
5174a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
518fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
519fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
520fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
521fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
522fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
523fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
524fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
525fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
526fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
527fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
528fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
529fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
530fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
531fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
532fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
533fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
534fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
535fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
536fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
5377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
538fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
539fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
54150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
54250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
5434a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
54450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
54550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
546738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
54750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
548738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
54950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
55050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
551fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
55250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
55350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
55450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
55550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
556fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
56150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
56250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
56350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
56450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
5654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
56650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
56750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
56850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
56950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
5707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
5717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
57221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
57321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
57421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
57521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
57621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
57721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
57821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
57921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
580738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
58121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
58221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
58321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
58421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
58521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
58621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
58721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
58821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
58921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
59021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
59121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
59221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
59321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
59421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
59521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
59621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
59721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
5987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
5990a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
6000a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
6010a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6020a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
6030a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
6040a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
6050a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
6060a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6070a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
6080a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
6090a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
6100a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
6110a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
6120a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
6130a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
6140a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
6150a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
6160a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6170a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6180a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
6190a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
6200a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
6210a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6220a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
6230a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
6240a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
6250a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
6260a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
6270a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
6280a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
6290a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
6315b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6325b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6335b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
6345b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
6355b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
6365b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
6375b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6385b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
6395b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
6405b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
6415b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
6425b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
6435b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
6445b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
6455b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
6465b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
6475b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
6485b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
6495b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
6505b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
6515b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
6525b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
6535b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6545b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
6555b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
6565b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
6575b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
6585b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
6595b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6605b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
6615b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
6625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
663725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
664725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
665725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
666725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
667725a820b926575265e6790601a0defd9c30947dcVadim Girlin
668725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
669725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
670725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
671725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
672725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
673725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
674725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
675725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
676725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
677725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
678725a820b926575265e6790601a0defd9c30947dcVadim Girlin
679725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
680725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
681725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
682725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
683725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
684725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
685725a820b926575265e6790601a0defd9c30947dcVadim Girlin
686725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
687725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
688725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
689725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
690725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
691725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
692725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
693725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
694725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
695725a820b926575265e6790601a0defd9c30947dcVadim Girlin
696725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
697725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
698725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
699725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
700725a820b926575265e6790601a0defd9c30947dcVadim Girlin
701725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
702725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
703725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
704725a820b926575265e6790601a0defd9c30947dcVadim Girlin
705725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
706725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
707725a820b926575265e6790601a0defd9c30947dcVadim Girlin
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
70972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
71296bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
71372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
7195b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
72035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
7218a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
722024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
723725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
724c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			switch (ctx->shader->input[i].name) {
725c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_FACE:
726725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
727c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
728c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_COLOR:
729725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
730c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
731c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_POSITION:
732c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				ctx->fragcoord_input = i;
733c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
734c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			}
735725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
736c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				if ((r = evergreen_interp_input(ctx, i)))
737725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
738fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
73950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
7455b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
746024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
74735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
74891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
74991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
75091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
75191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
75291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
75391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
75491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
75591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
756e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák				ctx->shader->vs_out_point_size = 1;
75791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
75854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
75954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
76054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
76154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
76291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
76391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
76733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
76847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
77096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
771c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
772c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
773951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			if (!ctx->native_integers) {
774951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				struct r600_bytecode_alu alu;
775951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
77696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
777951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
778951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].sel = 0;
779951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].chan = 3;
78096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
781951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.sel = 0;
782951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.chan = 3;
783951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.write = 1;
784951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.last = 1;
78596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
786951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
787951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin					return r;
788951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			}
789c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
79039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
79139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
79772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
79872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
799be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
800be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
801be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
802be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
803be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
8047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
805fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
806fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
807fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
808fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
809fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
810fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
811fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
812fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
813fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
814fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
815fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
816fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
817fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
818fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
819fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
820fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
821fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
822fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
823fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
824fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
825fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
826fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
827fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
828fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
829fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
830fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
831fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
832fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
833fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
834fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
835fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
836fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
837fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
838fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
839fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
840fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
841fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
842fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
843fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
844fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
845fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
846fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
847370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
848fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
849fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
850fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
8511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
8521fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
8531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
8541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
8551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
8561fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
8571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
8581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
8591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
8601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
8611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
86296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
8631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
8641fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
8651fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
8661fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
8671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
8681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
8691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
8704a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
8711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
8721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
8731fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
8741fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
8751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
8761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
87796bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
87839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
87939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
88039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
88139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
88239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
88339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
88439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
88539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
88639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
88739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
88839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
88939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
89039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
891c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
8921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
8931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
8941fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
8951fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
8961fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
8971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
8981fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
899077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
900077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
9014a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
902077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
903077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
904077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
905077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
9064a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
907077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
908077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
909077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
910077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
9118e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
912077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
913077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
914077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
915077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
916077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
917077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
918077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
919077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9204a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
921077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
922077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
923077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
924077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
9258e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
926077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
927077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
928077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
929077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
930077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
931077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
932077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
933077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
934077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
935077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
936077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
937077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
938077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
939077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
940077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
941d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
942077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9434a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
944077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
945077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
946077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
947077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
948077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9497687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
9507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
9517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9524a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
9537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
9547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
9557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
9567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
9577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
9587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
9597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
9607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
9617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
962077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
963077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
964077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
965077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
966077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
967077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
968077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
969077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
970077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
971077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
972077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
973077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
9757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
9767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
9774a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
9787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
9797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
9807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
9817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
9827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
9837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
9847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
9857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
9867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
9874a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
9887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
9897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
9907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
9917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
9927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
9937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
9947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
9957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
9967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
9977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
9987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
9997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
10007687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
10017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10034a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
10057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
10077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
10097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
10127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10154a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
10207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10254a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
10307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
10317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
10347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
1036725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1037725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
1038725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
1039725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1040725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
1041725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
1042725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
1043725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
1044725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1045725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1046725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1047725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
1048725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
1049725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1050725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
1051725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
1052725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
1053725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1054725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1055725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
1056725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1057725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
1058725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1059725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1060725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1061725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
1062725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1063725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
1064725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
1065725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
1066725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
1067725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1068725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1069725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
1070725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
1071725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
1072725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1073725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1074725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
1075725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
1076725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1077e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
107872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1079eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
1080eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct tgsi_token *tokens = pipeshader->tokens;
1081543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	struct pipe_stream_output_info so = pipeshader->so;
1082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
10835555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
1084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
10854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
1086457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
1087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
108854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
108954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
1090ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Declarations used by llvm code */
1091ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bool use_llvm = false;
10927f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned char * inst_bytes = NULL;
10937f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned inst_byte_count = 0;
109472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1095ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1096ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	use_llvm = debug_get_bool_option("R600_LLVM", TRUE);
1097ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
1099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
1100951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin	ctx.native_integers = (rctx->screen->glsl_feature_level >= 130);
1101951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin
1102c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
1104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
1106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
1107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
1108f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
1109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1110725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
1111c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	ctx.fragcoord_input = -1;
1112725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
111354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
1114725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1115725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1116feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
1117feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
1118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
1119076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
1120076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
1121076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
1122f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
1123f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
1124f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
1125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
1126076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
1127076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
1128076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
1129076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
1130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
1131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
1132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
1133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
1134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
1135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
1136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
1137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
1138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
1139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
1140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
1141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
114489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
11454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1146f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
11474a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1148f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
115089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1151fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
115284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
1153ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1154ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* LLVM backend setup */
1155ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1156ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm && ctx.info.indirect_files) {
1157ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		fprintf(stderr, "Warning: R600 LLVM backend does not support "
1158ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"indirect adressing.  Falling back to TGSI "
1159ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"backend.\n");
1160ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		use_llvm = 0;
1161ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1162ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1163ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		struct radeon_llvm_context radeon_llvm_ctx;
1164ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		LLVMModuleRef mod;
1165ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned dump = 0;
1166ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx));
1167ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1168ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens);
1169ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
1170ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			dump = 1;
1171ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1172ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count,
1173ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard							rctx->family, dump)) {
1174ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			FREE(inst_bytes);
1175ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			radeon_llvm_dispose(&radeon_llvm_ctx);
1176ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			use_llvm = 0;
1177ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			fprintf(stderr, "R600 LLVM backend failed to compile "
1178ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"shader.  Falling back to TGSI\n");
1179ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		} else {
1180ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_OUTPUT] =
1181ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					ctx.file_offset[TGSI_FILE_INPUT];
1182ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1183ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_dispose(&radeon_llvm_ctx);
1184ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1185ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1186ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* End of LLVM backend setup */
1187ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1188ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (!use_llvm) {
1189ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx.file_offset[TGSI_FILE_OUTPUT] =
1190ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_INPUT] +
1191ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1192ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
11944d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1195d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
119697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
119797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
119897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1199d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
12007728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
12018e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
12024d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
12038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
1204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1205cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
1206cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
12075555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
1213cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1214cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
1215cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
1216cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
1217cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
1218cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1219cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1220cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1221cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1222cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
1230725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1231725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
1232725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
123391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
123491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1235725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
1236725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
123791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
123891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
123991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
124091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
124191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
1242725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1243725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1244725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
1245725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1246725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
1247725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
1248725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1249725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1250725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1251c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	if (ctx.fragcoord_input >= 0) {
1252cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		if (ctx.bc->chip_class == CAYMAN) {
1253cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			for (j = 0 ; j < 4; j++) {
1254cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				struct r600_bytecode_alu alu;
1255cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1256cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1257cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1258cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].chan = 3;
1259cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie
1260cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1261cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.chan = j;
1262cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.write = (j == 3);
1263cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.last = 1;
1264cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1265cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie					return r;
1266cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			}
1267cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		} else {
1268cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			struct r600_bytecode_alu alu;
1269cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1270cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1271cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1272cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].chan = 3;
1273c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1274cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1275cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.chan = 3;
1276cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.write = 1;
1277cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.last = 1;
1278cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1279cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				return r;
1280cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		}
1281c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	}
1282c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1283725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
1284725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
1285725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
1286725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1287725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1288725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
1289725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1290725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
1291725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
1292725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
1293ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (use_llvm) {
1294ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				continue;
1295ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1299be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
1300be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
1301be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
13021fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
13037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
13047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
13057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
13067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
13077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
130889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
13097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
131089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
131150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
131250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
131350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1319725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1322eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1323ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Get instructions if we are using the LLVM backend. */
1324ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1325ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1326ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		FREE(inst_bytes);
1327ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1328ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1329457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
1330eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
133154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
133254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
133354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
133454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
133554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
133654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
133754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
133854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
133954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
134054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
134154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
134254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
13435a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		/* reset spi_sid for clipvertex output to avoid confusing spi */
13445a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		shader->output[ctx.cv_output].spi_sid = 0;
13455a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin
134654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
134754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
134854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
134954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
135054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
135154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
135254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
135354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
135454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
135554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
135654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
135754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
135854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
135954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
136054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
136154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
136254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
136354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
136454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
136554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
136654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
136754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
136854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
136954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
137054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
137154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
137254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
137354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
137454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1375543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1376543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1377543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1378543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1379543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1380543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1381543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1382543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1383543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1384543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1385543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
13868ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			if (so.output[i].dst_offset < so.output[i].start_component) {
13878ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
13882449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
13892449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1390543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1391543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1392543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1393543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1394543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
13958ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1396543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1397543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1398543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1399c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1400c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1401c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
14028ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1403543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1404543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1405543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1406543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1407543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1408543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1409543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1410543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1411543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1412543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1413543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1414543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1415543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1416543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1417543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1418543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1419543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1420543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1421543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1422543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1423543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1424543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1425543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1426543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1427543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1428543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1429543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1430543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1431543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1432543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1433543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1434543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1435543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1436543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1437543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1438543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1439543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1440eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
144154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
144254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
144354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
144454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
144554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
144654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
144754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
144854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
144954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
145054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
145154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
145254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1453457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
145591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
145691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
145754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
145854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
145991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
146091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
146191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
146254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
146354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
146454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
146554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
146654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
146791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
146891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
146954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
147054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
147154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
147254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
147354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
147454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
147554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
147654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
147754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
147854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
147954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
148091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
148113daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
148213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
148313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
148413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
148513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
149054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
149154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
14924f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
149354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					for (k = 1; k < shader->nr_cbufs; k++) {
149454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
149554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
149654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
149754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
149854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
149954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
150054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
150154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_w = 3;
150254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
150354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
150454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
150554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
150654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1507feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1508feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
15095f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
151054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
151154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
151254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
151354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
151454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
151539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
151654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
151754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
151854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
151954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
152054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
153172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
153254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
153354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
153454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
153554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
153654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1537457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1539457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
154054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
154154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
154454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
154554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
154654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
154754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
154854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
154954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
155054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
155154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
155254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1554c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
155554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1556481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && j == 0) {
155854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
155954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
156054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
156154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
156254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
156354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
156454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
156554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
156654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
156754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
156854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
156954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
157054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1571481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
157254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
157354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
157454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1575457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1576457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
157789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
15787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
15797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
15807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1581457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1582b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1583b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1584a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1585c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1586c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1587457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1588457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
15894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
15937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
159489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
15954a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
15967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1597783e4da72aa203a645737dec81b001341951a942Vadim Girlin	/* check GPR limit - we have 124 = 128 - 4
1598783e4da72aa203a645737dec81b001341951a942Vadim Girlin	 * (4 are reserved as alu clause temporary registers) */
1599783e4da72aa203a645737dec81b001341951a942Vadim Girlin	if (ctx.bc->ngpr > 124) {
1600783e4da72aa203a645737dec81b001341951a942Vadim Girlin		R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1601783e4da72aa203a645737dec81b001341951a942Vadim Girlin		r = -ENOMEM;
1602783e4da72aa203a645737dec81b001341951a942Vadim Girlin		goto out_err;
1603783e4da72aa203a645737dec81b001341951a942Vadim Girlin	}
1604783e4da72aa203a645737dec81b001341951a942Vadim Girlin
16053b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1609cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1616f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1617f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
16264a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1627a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1628a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1629a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1630a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1631a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1632a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1633a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1634a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1635a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1636a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1637a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
16384a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1639f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1640f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1641f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1642f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1643f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
16444a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
16453efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
16463efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
16473efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
16483efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
164980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
165080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
165180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
16524a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
16547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
166047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
166147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
16627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
16637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
16647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1667dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1669dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1670d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1671d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1672dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1673d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1674d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1675d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1676dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1677dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1678dffad730df17983cfaef0808555a8c26cad0aa15Christian König
16799b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1680dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1681dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16824a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1683dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1684dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1686d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1687d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1688d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1689d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
16904a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
169180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1693d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1694d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16964a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1698d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
16994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
17004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
17054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
17077a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
17084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
17097a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17139b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17164a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1723d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1724d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
17259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1726d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1727d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1728d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
17309b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
17319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
17329b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
17339b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
17349b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
17359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1736d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1737d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1738cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1739cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1740cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1741cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1742cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1743cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1744cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1745cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1746cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1747cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1748cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1749cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1750cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1751cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1752cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1753cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1754cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1755cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1756cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1757cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1758cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1759cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1760cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1761cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1762cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1763cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1764cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1765cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1766cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1767cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1768cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
17697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
17707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
17717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
17734a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
17747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
17757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
17774a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
17797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
17817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
17827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
17847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
17867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
17874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
17897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
17907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
17917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
17927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
17937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1794d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1795d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{
1796d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1797d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int i, j, k, r;
1798d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct r600_bytecode_alu alu;
1799d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1800d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	for (k = 0; k < last_slot; k++) {
1801d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1802d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			continue;
1803d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
1804d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		for (i = 0 ; i < 4; i++) {
1805d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1806d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.inst = ctx->inst_info->r600_opcode;
1807d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1808d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1809d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			}
1810d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1811d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.dst.write = (i == k);
1812d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (i == 3)
1813d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				alu.last = 1;
1814d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
1815d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (r)
1816d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				return r;
1817d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		}
1818d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	}
1819d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	return 0;
1820d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie}
1821d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
18227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
182388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
182488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
182588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
182688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
18271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
182888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
182996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
183096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
183196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
183296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
183396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
18344a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
18357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
18364a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1837a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
183888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
183988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
184088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
184188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
184288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
184388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
18444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
18457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1846921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
184788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1848a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
184996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1850ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
185188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
18524a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
185388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
185488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
185588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
18564a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1857a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
18587ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
185988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
186088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
186188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
186288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
186388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
186488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
186588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
18664a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
186788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
186888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
186988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
18704a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1871a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
187288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
187388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
187488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
187588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
187688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
187788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
187888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
187988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
18807ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1881921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
188288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1883921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1884ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
188596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
188689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1887a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1888a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
188996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
189096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
189196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
189296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
189396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
189496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
189588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
18964a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
189788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
189888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
189992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
190092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
190192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
19027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
19037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
19047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19054a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
19077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
19087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
19107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
19117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
19127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
19154a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
19177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
19187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
19217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
19237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
19247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
19257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
19287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
19297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
19307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
19317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
19327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
193392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
193492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
193592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19364a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
193792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1938dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
193992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
19401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
194192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
194292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
194388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19444a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
194588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
194688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
194788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
194888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
194988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
195088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
195188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
195288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19534a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
195488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
195588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
195688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
195788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1958be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1959be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1960be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1961be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
19624a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1963a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1964be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1965be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
196680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1967be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
196888f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
19694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
197088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
197188f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
197288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
197388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
197488f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
197588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
197692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
197792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
197892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19794a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
198192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
198257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
198357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
198457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
198557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
19861fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
198757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
198857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
198957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
199092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
199192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
199257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
199389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
19947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
19954a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
19977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
20007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
20027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
20057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20074a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20124a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
201592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20194a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
202357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
202492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
202592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
202657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
202789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
20294a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
20317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
20337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
20357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
20387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20404a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20454a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
20477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
204857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
20497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
20507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
20517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
20537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
20547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
20557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
205657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
205792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2058ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
2059ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
20604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2061ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2062ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2063ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
206480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2065ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2066ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
2067ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2068ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2069ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2070ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
20714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2072ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2073ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2074ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2075ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2076ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
2077ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
20784a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2079ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2080ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2081ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
208280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2083ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2084ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2085ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2086ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2087ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2088ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
20894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2090ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2091ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2092ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2093ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
209492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
209592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
209692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2097094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
2098094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
20994a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2100094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
2101094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
2102094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
21034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2104094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
21054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2106094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
21074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2108921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
21094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
21104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
21114502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
21124502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
21134502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
21144a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
21154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
2116094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
2117094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
2118094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
21194a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2120094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
2121094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
2122094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
21234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
21244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
21254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
21264502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
2127094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
2128094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
2129094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
21300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
21310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
21320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21334a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
21340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
21350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
2136f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
21374a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2138f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
21394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2140f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2141f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
2142f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2143f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
2144f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
2145f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
2146f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2147f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
21484a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2149f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
2150f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
2151f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
21520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
21530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
21546a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
21556a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
21567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
21576a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
215889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
2160f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
21614a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2163f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
2164f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
2165f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
2166f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
21677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
21687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
21717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
21727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
21734a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
2178f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
21794a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2181f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
2182f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
21832fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
21842fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
21852fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
21867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
21910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
21926a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
21936a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
21940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
219586f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
21964a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2197a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
219886f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
219986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
22004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
22014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
22020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
22030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
22040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
22050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
22060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
22074a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
22080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
22090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
22100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
221189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
22144a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
22177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
22187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
22197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
22207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
22237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
22244a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
22297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
22304a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
22337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
22347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
22357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
2241abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
22428567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
22434a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22448567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
22458567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
22468567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
22478567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
22488567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
22494a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
22508567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
22518567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
22528567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
2253abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
22544a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2255abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
22564a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2257abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2258abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
2259abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2260abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
22614a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2262abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2263abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2264abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
2265abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
22664a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2267abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2268abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
2269abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
2270abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2271abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
2272abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
22734a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2274abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2275abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2276abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
22770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
22780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
22790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
228042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
228142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
228242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22834a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
228442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
228542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
22864a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2287df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2288370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
2289df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2290df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
2291df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2292df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
2293df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
229442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
22954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
22964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
229742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
229842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
229942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
230042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
23014a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
230242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
230342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
230442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
230542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
230642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
230742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
2308a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
23097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
23107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23114a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2312a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
23137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
23147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
23154a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2317a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
23187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
231980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
23217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
23227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
23234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
23257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
23267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
23277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
23287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
23297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
2330a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2331a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
2332a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23334a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2334a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
2335a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
23364a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2337a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
2338a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
23394a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2340a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
2341a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2342a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2343a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
23444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2345a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2346a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2347a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
2348a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2349a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2350a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
23517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
23527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
23537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
23554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
23567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
23577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
23594a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
23614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
23627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
23637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
23647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
23657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
23667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
23697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
23707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
23717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
23734a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
23754a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
23767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
23777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
23787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
23797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
23804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
23817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
23827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
23837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
23857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
23864a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
23897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
23927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
23937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
23967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
23977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
23987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
23997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
24007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2401a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2402a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
24034a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2404a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2405a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2406a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
24074a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2408a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24094a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2410a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2411a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2412a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24134a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2415a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2416a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
24174a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
241866f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24194a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24244a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2425a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
24284a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2429a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24344a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2441332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2442332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2443332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
244429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int i, r, j;
2445332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2446332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2447332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
24484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
244929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int tmp3 = r600_get_temp(ctx);
24504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
24514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
24534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
24554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
24564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
24574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
24584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
24594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
24604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
24614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
24624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
24634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
24644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
24654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
24674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
24684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
24694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
24714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
24734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
24744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
24764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
24784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
24794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
24814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
24834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
24854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
24864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
24884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
24894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
24914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
24934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
24944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2495332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2496332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2497332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2498332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2499332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2501332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
25034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2505332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
25084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2509332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2511332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2513332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2519332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2521332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2524332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2525332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2527332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2529332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
25354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
25364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2547332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2548332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2569332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
25844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2589332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2590332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
259229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
259329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp3.x = u2f(src2) */
259429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
259529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2596332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
259729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
259829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
259929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
260029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
260129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
260229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
260329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
260429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
260529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
260629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
260729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
260829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
260929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
261029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
261129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
261229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp0.x = recip(tmp3.x) */
261329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 3; j++) {
261429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
261529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
261629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
261729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
261829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
261929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 0);
262029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
262129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp3;
262229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
262329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
262429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (j == 2)
262529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.last = 1;
262629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
262729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
262829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
262929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
263029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
263129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
263229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
263329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
263429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
263529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
263629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
263729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].value = 0x4f800000;
263829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
263929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
264029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
264129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
264229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
264329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (r)
264429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
264529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
264629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
264729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
264829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
264929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
265029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
265129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
265229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
265329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp3;
265429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
265529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
265629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
265729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
265829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
266129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
266229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
266429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
266529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
266629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
266729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
266829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
266929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
267029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
267129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
267229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
267329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
267429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
267529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
267629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
267729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
267829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
268129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
268229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
268329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
268429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2685332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
268629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
268729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
268829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
2689332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
269029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
269129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
269229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
269329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
269429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
269529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
269629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
269929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
270029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
270129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
27034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2706332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
271929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
27244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
27264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
27284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
27304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
27314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
27324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
27344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
27354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
27364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
27384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
27394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
27404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
274329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
27464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
274829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
274929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
27504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
275229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
27534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
276329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
27644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
276529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
276629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2767332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
276829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
276929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
277029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
277129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
277229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
277329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
277429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
277529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
277629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
277729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
277829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
277929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
278029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
278129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
278429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
278529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
2786332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
27884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
27904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2791332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
27934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
27944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
27954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
27974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
27984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
27994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
28004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
28014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
28024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
280829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
281129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2812332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
281329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
281429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
281529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 3);
28164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
281729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
281829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 2;
28194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
282029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
282129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
28224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
282329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
282429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
282529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
282629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
282729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		} else {
282829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
282929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
283029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
283129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
283229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 3;
283329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
283429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
283529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
283629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 2;
283729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
283829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
283929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 0;
284029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
284129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
284229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
284329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
284429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
28454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
28474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2849332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2850332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
28514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2852332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2853332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
28564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
28584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2859332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
28604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2861332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2862332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2864332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2866332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2867332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
28684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2869332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2870332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
28734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2875332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2876332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
28774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2878332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2879332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
28814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2884332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
28914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
28924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
28934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
290129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
290229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
290329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
290429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
290629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
290729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
290829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
29094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
291029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
291129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
29124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
291329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
291429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
291529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 0;
291629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
291729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
291829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
291929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
292029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
292129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
292229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
292329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
29244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
292529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
292629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
29274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
292829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
292929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
293029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
293129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
293229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
293329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
293429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
293529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
293629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
293729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
293829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
293929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
294029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
294129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
294229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
294329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
294429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
294529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
29464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
294829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
294929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
295029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
295129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
295329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
295429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
295529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
29564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
295729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
295829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].sel = tmp2;
295929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].chan = 1;
296029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
296129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
296229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
296329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
296429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
296529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 2;
296629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
296729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
296829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
296929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
297029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
29714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
297229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
297329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
29744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
297529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
297629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
297729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
29784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
297929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
298029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
298129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
298229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
298329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
298429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
298529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
298629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
298729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 2;
298829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
298929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
299029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
299129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
299229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
29934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
29954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
29974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
29994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
30004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
30014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
30044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
30054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
30074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
30084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
30104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
30114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
30154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
30174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3019332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3020332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
30214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
3022332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
3023332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
30254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
30264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
30284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
30294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
30314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3032332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
3036332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
30384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
30404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
30424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
30434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
30444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
30474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
30484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
30504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
30514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
30534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
30544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3057332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3058332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
3060332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
3062332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3064332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3065332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
30664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
3067332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
3068332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
30704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
3071332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
30734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
30744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
30754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
30764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
30774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
30784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
30804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
30824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
30844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
30864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
30884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
30894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
30904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
30924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
30934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
30944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
30954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
30964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
30974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
30984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
31054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
31074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
31124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
31284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3136332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
31374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3138332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
3139332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
31414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
31464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3147332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
31494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
31514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
31564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
3159332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
3162332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
31654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3166332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
31694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
31704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
31724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
31734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
31794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3190332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3191332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
3197332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3200332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3201332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
32194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
32214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
32254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
32284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
32364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
32374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
32414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
32434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
32514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
32554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
32644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
32714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
32794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
32804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
3281332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
3282332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
3283332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
32864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
32904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
32954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
32964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
33024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33046b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
33056b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
33066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
33076b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
33086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
33096b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
33106b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
33116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
33136b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
33146b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
33156b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
33166b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33176b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33186b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33196b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33206b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
33216b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
33226b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
33236b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33246b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
33256b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
33266b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33276b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
33286b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
33296b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
33306b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
33316b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
33326b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
33336b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33346b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
33356b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
33366b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
33376b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
33386b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33396b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33406b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33416b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
33426b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
33436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
33476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
33486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
33496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
33506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
33516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
33526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
33536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
33546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
33556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
33566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
33576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
33586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
33596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
336042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
336142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
336242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
336342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
336442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
336542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
336642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
336742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
336842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
336942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
337042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
337142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
337242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
337342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
337442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
337542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
337642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
337742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
337842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
337942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
338042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
338142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
338242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
338342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
338442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
338542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
338642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
338742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
338842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
338942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
339042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
339142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
339242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
339342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
339442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
339542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
339642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
339742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
339842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
339942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
340042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
340142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
340242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
340342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
340442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
340542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
340642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
340742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
340842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
340942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
341042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
341142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
341242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
341342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
341442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
341542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
341642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
341742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
341842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
341942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
342042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
34216b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34226b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34230d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
34240d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
34250d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
34264a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3427921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
34280d48925a56ad4fb253386110b545abda82a25464Dave Airlie
34290d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
34300d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
34314a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3432a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
34330d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
3434cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
34350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
3436cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
34370d48925a56ad4fb253386110b545abda82a25464Dave Airlie
34384a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3439921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
34404a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
34410d48925a56ad4fb253386110b545abda82a25464Dave Airlie
34420d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
34430d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
34444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
34450d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
34460d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
34470d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
34480d48925a56ad4fb253386110b545abda82a25464Dave Airlie
34490d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
34500d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
34514a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3452a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
34530d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
345480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
34550d48925a56ad4fb253386110b545abda82a25464Dave Airlie
34560d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3457cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
34580d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
34590d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3460921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
34610d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
34620d48925a56ad4fb253386110b545abda82a25464Dave Airlie
34630d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
3464cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
34650d48925a56ad4fb253386110b545abda82a25464Dave Airlie
34660d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
34670d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
34684a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
34690d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
34700d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
34710d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
34720d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
34730d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
34740d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3475cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3476cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
34774a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3478cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
3479cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3480cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
34814a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3482cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3483a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
34846c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
3485cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
3486a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
348780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3488cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
3489cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
3490cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3491cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
3492cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
3493cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
34944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3495cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
3496cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
3497cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
3498cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
3499cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3500cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
3502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
3503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35044a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
3506dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
35087be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
35097be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
35107be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
35117be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
35124a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
35154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
35177be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
351880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
3520cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
3521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
35227be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
3523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
35254a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
35297be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3530cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3531cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3532cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
3533cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
3534cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35354a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3536cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
3537cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
35394a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3540cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3541cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
35424a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3543cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3544a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
354580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3546cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
3547a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3548cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
3549cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
3550cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
3551cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
3552921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3553cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3554cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3555cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3556cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3557cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3558921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3561cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3562e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3563e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3564e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3565e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3566e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3567e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3568e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
35754a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
35797be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
35826415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
35836415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
35846415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
35856415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35866415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3587192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3588192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
35896415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
35906415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
35916415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
35926415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
35936415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
35946415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
35956415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35966415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
35976415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
35986415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
359933241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
360033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
360196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
360233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36034a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
36044a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3605641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
360640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3607bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3608da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3609da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
36106415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
361178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
361213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
361378293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3614641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
36156415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3616641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
36171d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
36181d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
36191d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
36201d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
36211d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
36221d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
36231d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
36241d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
36251d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
36261d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
362713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
362813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
362913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
363040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
363140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
36324a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
363340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
363440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
363540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
363640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
363740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
363840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
363940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
364040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
364140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
364240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
364340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
364440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
364540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
36464a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
364740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
36484a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
364940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
365040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
365140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
365240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
365340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
36544a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
365540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
365640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
365740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
365813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
365940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
366040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
366140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
366240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
366340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
366440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
366540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
366640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
366740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
366840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
366940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
367040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
367140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
367240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
367340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
367440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
36754a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
367640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
367740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
367813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
367913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
36807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3681b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
368289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
36837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
36847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
36854a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
36867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
36874a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3688bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
36907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
36917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
36927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
36937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
36947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
36954a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
36967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
36977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
36987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
36997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
37017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
37024a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
37044a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
37057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
37077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
37097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
37104a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
37117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
37127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
37149d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3715b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
37164a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3717a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3718b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
37197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
37204a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3721b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3722b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3723b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
37244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3725b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3726b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3727b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
37284a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3729a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3730921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3731b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3732b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
37364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3737b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3738b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
373978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3740b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
37439783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
37449783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
3745261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ) {
3746261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
37470e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
37480e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3749bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
37524a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3753a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
37544a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
37554a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3759bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
37614a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3766bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
376789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
37687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
37694a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
37717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
37727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
37787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
37804a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
37854a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
37887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
37927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
37937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
37944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
37987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
38017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
38034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3804a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3805bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3806bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3807bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3808bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3809bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
38117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3814a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3815bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3817bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38204a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38244a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3825a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3829bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
38327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3835a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
38424a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
38459783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
38469783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
38479783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38489783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
38499783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
38509783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
38519783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
38529783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
38539783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
38549783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
38559783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
38569783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
38579783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
385878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3859bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
3860bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3861bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
386278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
3863b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
38644a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3865a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
38664a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
3870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
3871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
38724a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3875b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
387678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
38797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3880bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
3881929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3882929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
38836b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
38849783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
3885929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
3886929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
3887de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
3888de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
3889de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
3890de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3891de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
3892de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
3893de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3894c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
3895c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
3896c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
3897de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
3898de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
3899de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3900de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
3901de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
390233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
39034a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
3904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
39056415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
39066415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
3907077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
3908641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
39096c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
39109d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
39119d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
39129d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
39139d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
391478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
391578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
391678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
391778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
391878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
391978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
392078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
392178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
392278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
392378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
3924244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
392578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
39269a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
3927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
3928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
3929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
3930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
3931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
3932bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
39339783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
39349783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
39359783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
39369783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
39379783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_w = 2; /* route Z compare value into W */
39389783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
3939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39406b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
39416b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
394201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
394301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
394401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
39456b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
39466b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
3947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39481d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
39491d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
39501d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
395169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
3952929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
3953929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
3954929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
3955929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3956929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
39576b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
3958929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
3959929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
3960929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
396178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
3962929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
3963929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
3964929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
3965929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
3966929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
3967929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
3968929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
3969929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
3970929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
3971929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
3972929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
3973929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
3974929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
3975929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
3976929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
3977929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
3978929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
3979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
3981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
3982bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
3983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
3985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
398633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
398733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
3988b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
3989b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
3990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
39914a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3992dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
3994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
3995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3996c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
39971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
3998c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
3999c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4000c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
4001c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
40024a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4003c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
40044a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
40054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4006c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
400780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4008c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
4009c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
4010c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
4011c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
40124a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4013c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
4014c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
4015c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
4016c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
4017c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
4018c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
4019b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
4020dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4021dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4022dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4023dffad730df17983cfaef0808555a8c26cad0aa15Christian König
40244a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4025a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4026921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
4027b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
40284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
40294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
4030b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4031b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4032dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4033b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4034b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4035b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
40364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4037b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4038b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4039b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4040b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4041b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
4042dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4043dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4044dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4045dffad730df17983cfaef0808555a8c26cad0aa15Christian König
40464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4047a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4048b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
4049b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
40504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4051b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4052b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4053dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4054b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4055b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4056b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
40574a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4058b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4059b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4060b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4061b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4062b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
4063dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4064dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4065dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4066dffad730df17983cfaef0808555a8c26cad0aa15Christian König
40674a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4068a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4069b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
40704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
40714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4072b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
4073b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
4074dffad730df17983cfaef0808555a8c26cad0aa15Christian König
407580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4076b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4077dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4078b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4079b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
40804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4081b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4082b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4084dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
4085b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
4086b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
408787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
408887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
408987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
40904a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
409187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
4092dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
409387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
40947be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
40957be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
40967be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
409787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
40984a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4099a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
41004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
41014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
41024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
410380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
410487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
410587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
410687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
41077be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
410887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
41094a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
411087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
411187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
41127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
411387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
411487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
411587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
41160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
41170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
41180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41190e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
41200e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
41214a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
41220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
41230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
41240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
41260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
41270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
41294a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4130a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
41310e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
41324a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
41334a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
41340e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
41350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
41360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
41370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
41380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
41390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
41400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
41420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
41430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
41440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
41460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
41474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
41480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
41490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
41500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
41510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
41534a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4154a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
41550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41560e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
41574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
41584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
41590e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
41600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
41610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
41620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
41630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
41640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
41650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
41670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
41680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
41690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
41700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
41710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
417280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
417380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
41740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
41750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
41760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
41770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
41780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
41794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
41800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
41810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
41820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
41830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
41840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
41850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
41860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
41870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
418836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
418936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
419036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41914a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
419209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
41937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
419436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
419536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
419636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
41974a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
419836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4199a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
42004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
420136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
420236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
420336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
420436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
420536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
42064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
420736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
420836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
420936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
421089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
42117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
42127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
42137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
42147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
421536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
42167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
42177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
42187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
42197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
42207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
42217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
42224a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
42237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
42247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
42257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
42267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
42277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
42287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
42297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
42307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
42317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
42327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
42337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
42347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
42354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
42367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
42377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
42387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
423936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
42407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
424136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
424236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
42434a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
424436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4245a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
42464a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
424736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
424836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
4249b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
4250b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4251b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
4252b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
4253b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
425436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
425536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
425636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
425736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
425836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
42594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
426036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
426136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
426236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
426336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
426436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
426536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
426689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
42677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
42684a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
42697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
42704a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
427136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
42727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
42737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
42747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
42757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
42767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
42777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
427836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
42794a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
42807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
42817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
42827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
42837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
42844a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
42857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
42864a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
428736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
42887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
42897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
42907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
42917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
42927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
42937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
42944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
42957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
42967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
42977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
429836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
429936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
430036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
430136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
43024a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
430336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4304a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
430536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
430636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
430736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
430836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
430936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
431036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
431136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
43124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
431336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
431436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
431536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
431636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
431736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
431887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
4319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
4320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
4321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
43224a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
43247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
4325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4326f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
4327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
432889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43304a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
43327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
43334a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
43344a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
43357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
43387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
43397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
43407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
43417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
43424a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
4346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
43477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
43484a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
43497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
43514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
43524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
43537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
43557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
43567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
43577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
43584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
43597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
43607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
43617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4362460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4363460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4364460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
4365460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4366460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4367460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4368460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
4369460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4370460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4371460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
43724a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4373460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4374460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4375460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4376460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4377f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4378460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4379460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
438089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43824a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
438396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
43847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
43854a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
43864a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
438796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
43887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
43907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
43917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
43927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
43937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
43947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43954a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
43997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44004a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44034a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44044a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
44057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
44087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44114a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
441596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44164a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
441796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
441896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
441996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
442096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
442196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
442296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
442396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
442496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
442596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
442696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44274a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
442896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
442996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
443096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
443189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44334a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
44367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
44377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
44417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
44437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
444496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44454a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
44497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44504a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
44537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
445496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
44577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
445996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44604a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
446496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
446589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44674a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
44697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
44707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
44717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
44757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
44777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44794a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
44837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44844a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
44867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
44877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
448896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
44917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
449396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
449896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44994a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
450096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
450196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
450296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
450596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
450696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
450796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
4508460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4510460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
4511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45144a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4516460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4517460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4518460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4519f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
4520460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
452189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45234a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4524460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45264a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45274a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
4528460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
4535460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45364a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45414a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45444a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
45507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4556460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4557460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4558460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4559460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
45604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4561460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4562460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4563460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4564460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4565460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4566460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4567460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4568460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4569460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4570460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4572460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4573460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4574460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4575460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4576460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4577460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4578460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
457998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
458098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
458198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
45824a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
458398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4584a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
45854a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
458698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
458752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
458852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
458952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
459052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
459152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
459252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
459352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
45949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
45958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
45969b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
459752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
459852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
459952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
460052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
460152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
46028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
460398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
46048e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
46058e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
46064a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
460798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
460898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
46098e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
46108e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
461198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
461298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
461398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
461447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
461547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
46164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
461747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4618a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
46197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
46207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4621077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4622077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
46234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46248e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4625077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4626077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4627077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
46284a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4629077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4630077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
46338e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
46348e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4635077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4636077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4637077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
46384a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4639077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
46407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
46417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4642077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4643077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
46444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46458e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4646077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4647077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4648077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
46494a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4650077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
46517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
46529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
46538e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
46548e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
46558e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46568e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
46578e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
46588e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
46598e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
46608e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
46618e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
46629b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
46637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
46647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
46657ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
46667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
46677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
46688e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
466947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
467047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
467147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
467257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
467357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
467457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
46754a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
467657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
467757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
467857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
46794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
468057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4681a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
468280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
46837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
46847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
468557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
468657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
46874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
468857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
468957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4690a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
469157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
469257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
46934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
469457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
469557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
469657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
46974a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
469857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
469957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
470057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
470157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
470257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
470357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4704a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
47064a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4707a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4708a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
47094a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4710a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4711a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
4712a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4713a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4714a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4715a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4716a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
47174a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4718a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4719a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
47207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4721a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4722a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
47234a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4724a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4725a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4726a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4727a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4728a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4729a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4730a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
47312bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
47322bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
47332bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
47342bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
47352bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
47364f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
47372bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
47384f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
47392bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
47402bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
47412bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
47422bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
47434f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
47442bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
47452bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
47464f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
47472bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
47482bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
47492bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
47502bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
47512bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
47522bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
47532bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
47544a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
47558813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
47568813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
47578813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
47582bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4759a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4760a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4761a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
476209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4763a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
476409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
476509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
476609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
476709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
476809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
476909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
477009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
477109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
477209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
477309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
477409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
477509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
477609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
477709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4778a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
477909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
478009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
478109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
478209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
478309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
478409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
478509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
478609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
478709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
478809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
478909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4790a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4791a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4792a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
479309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
479409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
479509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
479609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
479709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
479809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
479909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
48007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
480109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
480209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
480309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
480409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
480509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
480609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
480709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
480809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
480909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
481009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
481109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
481209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
481309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
481409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
481509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
481609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
481709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
481809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
481909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
482009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
482109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
482209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
482309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
482409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
48254a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
48264a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
482709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
482809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
482909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4830a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
483109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
483209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4833a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
483409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
483509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
483609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
483709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
483809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
483909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
484009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
484109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
484209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
484309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
484409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
484509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
484609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
484709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
484809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
484909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
485009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
485109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
485209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
485309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
48544f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
485509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
485609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
485709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
485809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
485909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
486009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
48614f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
486209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
4863370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX work out offset */
486409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
486509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4866a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
486709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
486809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
486909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
487009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
487109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
487209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
487309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
48747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
487509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
487609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
487709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
487809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
487909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
488009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
488109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
488209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
488309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
488409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
488509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
488609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
488709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
488809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
488909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
48904a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
489109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
489209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
489309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
489409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
489509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
489609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
489709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
489809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
489909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
490009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
49018b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
490209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49034a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
490409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
490509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
490609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
490709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
4908a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4909a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4910a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4911a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
4912a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
49134a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
4914a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
4915a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
491609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
4917a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
4918a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4919a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4920a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4921a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
4922a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
4923a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
4924a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
4925a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
4926a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
4927a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
4928a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4929a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
4930a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
4931a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
4932a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
493309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
4934a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
493509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
493709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
493809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
493909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
494009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
49434a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
494409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
4946a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
494809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
495109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
495209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
495309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49564a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
495909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
496409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
496509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
496609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
497309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
497409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
4975370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX add LOOPRET support */
497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
497809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
498009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
499309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49964a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
499909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
500009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5001a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5002a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5003a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5004cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
5005cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
5006cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5007cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
5008cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
5009cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
5010cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5011cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
5012cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5013cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5014cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5015cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5016cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5017cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5018cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
5019cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
5020cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
5021cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5022c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
5023cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
5024cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5025cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5026cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
50279b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
5028cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5029cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5030cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5031cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5032cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5033cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5034cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5035cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5036cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5037cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5038cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5039cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5040cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5041c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5042cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5043cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
5044cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
5045cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5046cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5047cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
5048cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
5049cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5050cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5051cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5052cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5053cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5054cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
5055cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
5056cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
505898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
50600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5061df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
5062370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
5063df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
5064df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
5065df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
5066df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
5067df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
506842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
506936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5070460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5073cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5074cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
507557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5076dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5078d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5079be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5082b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50903af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50923af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5093df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
50947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
50954558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5096a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
50970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51007a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5102e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
510388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
51043af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
51053af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
51064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51120d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51140d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
511588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5116d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
51170d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5119b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
512013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5121b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51289f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51320d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
513387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
513492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5135c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5138cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5139ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
514009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5141a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5145a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5146a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5153c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5154cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
51550ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5156d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
5157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5159c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5160c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
51614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5162cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51641d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
51651d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
516609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
516909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
517109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5188094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5192bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
5193332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5194c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5195c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
51965893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5197c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5198d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
51990196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5200c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
52019a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5202c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
52034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5204c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5205c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5206c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
52074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5208850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5209c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5210c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5211d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
52127383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5213c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
5214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5218cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
5219cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
5220cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5221cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5222cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5223cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5224cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5225cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5226cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5227cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
5228cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5229cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
52309b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
52319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
52326b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
523342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
523650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
523750526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
523898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
523950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
524050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
524150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
52428ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
524350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5244112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
524550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
524650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
524750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
524850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
524950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
525050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
525150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
525250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
525350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
525450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
525550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
525650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
525750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
525850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
525950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
526050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
526150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
526250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
526350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
526450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
526550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
526650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5267df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
526850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
526950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
527050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
527150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
527250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
527350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
527450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
527550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
527650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
527750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
527850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
527950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
528050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
528150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
528250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
528350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
528450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
528550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
528650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
528750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
528850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
528950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
529050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
529150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
529250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
529350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
529413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
529550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
529650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
53037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
53077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
53087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5309c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
53107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
53137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
53147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
53157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
53167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
53177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
53207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
53217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
53227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5327608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5328cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
53297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5330d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
53317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
53327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5333cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5334cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
53354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5336cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
53377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53381d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
53391d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
53407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
53417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
53447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
53467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
53487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
53547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
53637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
53647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
53657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
536660bf0f05b472e66bf1175fcec7a274dab6f7e2a3Vadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
5367332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5368cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5369cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5370cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5371cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5372d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5373cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
537460bf0f05b472e66bf1175fcec7a274dab6f7e2a3Vadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans},
5375b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5376cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
53774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5378cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5379cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5380cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
53814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
53829b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5383cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5384cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5385d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
53867383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5387cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
53887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5392cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
5393cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
5394cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5395cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5396cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5397cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5398cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5399cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5400cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5401cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
5402cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5403cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
54049b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
54059b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
54066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
540742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
54087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
54107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
54117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
54127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
54137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
54147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
54157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
54167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
54177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
54187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
54197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
54207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
54217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
54247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
54257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
54267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
54277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
54287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
54297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
54307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
54317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
54397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5441df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
54427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
54437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
54447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
54457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
54467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
54497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
54527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
54537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
54547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
54557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
54617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
54637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
54647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
54657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
54667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
546813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
54697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
54707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
547750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
547950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
548050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
548150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
548250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5483c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
548450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
548550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
548650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5487ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
548850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
548950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
549050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
549150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
549250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
549350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
549450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
549550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
549650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
549750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
549850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
549950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
550050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5501f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5502cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
55030ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5504f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
550550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
550650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5507f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5508f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
550929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5510cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
551150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55121d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
55131d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
551450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
551550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
551650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
551750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
551850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
551950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
552050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
552150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
552250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
552350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
552450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
552550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
552650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
552750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
552850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
552950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
553050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
553150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
553250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
553350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
553450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
553550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
553650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
553750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
553850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
553950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5540f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
554129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5542cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5543cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5544f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5545f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5546f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5547f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5548f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5549f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5550f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
555129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5552f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5553f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5554f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
555529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5556d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5557f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5558f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5559f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5560f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5561f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
556250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5566cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
5567cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
5568cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5569cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5570cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5571cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5572cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5573cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5574cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5575cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
5576cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5577cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5578f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
55799b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5580f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5581f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
558250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
558350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5584