r600_shader.c revision cd97a5f660399212a23b6dcd02906231f2dc5525
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;
1124acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_pipe_shader_selector *sel = shader->selector;
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse
115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
118c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
121052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
1224acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		tgsi_dump(sel->tokens, 0);
123543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1244acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		if (sel->so.num_outputs) {
125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			unsigned i;
126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			fprintf(stderr, "STREAMOUT\n");
1274acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			for (i = 0; i < sel->so.num_outputs; i++) {
1284acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin				unsigned mask = ((1 << sel->so.output[i].num_components) - 1) <<
1294acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin						sel->so.output[i].start_component;
130543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				fprintf(stderr, "  %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i,
1314acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin					sel->so.output[i].output_buffer, sel->so.output[i].register_index,
1322449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        mask & 1 ? "x" : "_",
1332449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 1) & 1 ? "y" : "_",
1342449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 2) & 1 ? "z" : "_",
1352449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 3) & 1 ? "w" : "_");
136543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
137543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
138052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
139eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	r = r600_shader_from_tgsi(rctx, shader);
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_build(&shader->shader.bc);
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
149052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
1504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_dump(&shader->shader.bc);
151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
152052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
153afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15669251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
157ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
1586101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
1594a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_clear(&shader->shader.bc);
160ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1652b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
167a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
18478293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	struct r600_bytecode			*bc;
1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
18640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
18778293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				*literals;
18878293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				nliterals;
18978293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				max_driver_temp_used;
190fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
195725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					face_gpr;
196725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					colors_used;
19754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	boolean                 clip_vertex_write;
19854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	unsigned                cv_output;
199c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	int					fragcoord_input;
200951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin	int					native_integers;
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
21142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
212ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only);
213ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type);
214ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_else(struct r600_shader_ctx *ctx);
215ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endif(struct r600_shader_ctx *ctx);
216ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx);
217ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endloop(struct r600_shader_ctx *ctx);
218ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx);
219ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
220ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/*
221ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * bytestream -> r600 shader
222ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard *
223ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * These functions are used to transform the output of the LLVM backend into
224ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * struct r600_bytecode.
225ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard */
226ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
2276a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
2286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				unsigned char * bytes,	unsigned num_bytes);
2296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#ifdef HAVE_OPENCL
2316a829a1b724ca0d960decee217d260b4de8a5463Adam Rakint r600_compute_shader_create(struct pipe_context * ctx,
2326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	LLVMModuleRef mod,  struct r600_bytecode * bytecode)
2336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
2346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *r600_ctx = (struct r600_context *)ctx;
2356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned char * bytes;
2366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned byte_count;
2376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_shader_ctx shader_ctx;
2386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned dump = 0;
2396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
2416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		dump = 1;
2426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_llvm_compile(mod, &bytes, &byte_count, r600_ctx->family , dump);
2456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader_ctx.bc = bytecode;
2466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_bytecode_init(shader_ctx.bc, r600_ctx->chip_class, r600_ctx->family);
2476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader_ctx.bc->type = TGSI_PROCESSOR_COMPUTE;
2486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_bytecode_from_byte_stream(&shader_ctx, bytes, byte_count);
2490c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	if (shader_ctx.bc->chip_class == CAYMAN) {
2500c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard		cm_bytecode_add_cf_end(shader_ctx.bc);
2510c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	}
2526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_bytecode_build(shader_ctx.bc);
2536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	if (dump) {
2546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		r600_bytecode_dump(shader_ctx.bc);
2556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	return 1;
2576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
2586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif /* HAVE_OPENCL */
2606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2612c485cda2062ca2b9af89ea62618515d960c7904Tom Stellardstatic uint32_t i32_from_byte_stream(unsigned char * bytes,
2622c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard		unsigned * bytes_read)
2632c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard{
2642c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	unsigned i;
2652c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t out = 0;
2662c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	for (i = 0; i < 4; i++) {
2672c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard		out |= bytes[(*bytes_read)++] << (8 * i);
2682c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	}
2692c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	return out;
2702c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard}
2712c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_src_from_byte_stream(unsigned char * bytes,
273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx)
274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned i;
276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned sel0, sel1;
277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel0 = bytes[bytes_read++];
278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel1 = bytes[bytes_read++];
279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].sel = sel0 | (sel1 << 8);
280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].chan = bytes[bytes_read++];
281ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].neg = bytes[bytes_read++];
282ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].abs = bytes[bytes_read++];
283ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].rel = bytes[bytes_read++];
284ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].kc_bank = bytes[bytes_read++];
285ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for (i = 0; i < 4; i++) {
286ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8);
287ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
288ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
289ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
290ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
291ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx,
292ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
293ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
294ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned src_idx;
295ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst0, inst1;
296ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for(src_idx = 0; src_idx < 3; src_idx++) {
299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		bytes_read = r600_src_from_byte_stream(bytes, bytes_read,
300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								&alu, src_idx);
301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.sel = bytes[bytes_read++];
304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.chan = bytes[bytes_read++];
305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.clamp = bytes[bytes_read++];
306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.write = bytes[bytes_read++];
307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.rel = bytes[bytes_read++];
308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst0 = bytes[bytes_read++];
309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst1 = bytes[bytes_read++];
310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.inst = inst0 | (inst1 << 8);
311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.last = bytes[bytes_read++];
312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.is_op3 = bytes[bytes_read++];
313ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.predicate = bytes[bytes_read++];
314ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle = bytes[bytes_read++];
315ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle_force = bytes[bytes_read++];
316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.omod = bytes[bytes_read++];
317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.index_mode = bytes[bytes_read++];
318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_alu(ctx->bc, &alu);
319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
320ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* XXX: Handle other KILL instructions */
321ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) {
322ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->shader->uses_kill = 1;
323ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		/* XXX: This should be enforced in the LLVM backend. */
324ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->bc->force_add_cf = 1;
325ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
326ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
327ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
328ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
329ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu,
330ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned pred_inst)
331ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
332ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->inst = pred_inst;
333ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->predicate = 1;
334b4789860c4416ba700ac5edeb692b59e33d45276Tom Stellard	alu->dst.write = 0;
335ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].sel = V_SQ_ALU_SRC_0;
336ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].chan = 0;
337ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->last = 1;
338ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_alu_type(ctx->bc, alu,
339ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	fc_pushlevel(ctx, FC_IF);
343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			struct r600_bytecode_alu *alu, unsigned compare_opcode)
348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned opcode = TGSI_OPCODE_BRK;
350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (ctx->bc->chip_class == CAYMAN)
351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else if (ctx->bc->chip_class >= EVERGREEN)
353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else
355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	llvm_if(ctx, alu, compare_opcode);
357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_loop_brk_cont(ctx);
358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_endif(ctx);
359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst;
366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0);
368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst = bytes[bytes_read++];
369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	switch (inst) {
370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 0:
371ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		llvm_if(ctx, &alu,
372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 1:
375bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		llvm_if(ctx, &alu,
376bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
377ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 2:
379bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_else(ctx);
380ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 3:
382bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endif(ctx);
383ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 4:
385bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_bgnloop(ctx);
386ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
387ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 5:
388bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endloop(ctx);
389ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
390ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 6:
391ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
392bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
393ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
394ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 7:
395bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		r600_break_from_byte_stream(ctx, &alu,
396bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
397bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		break;
398bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune	case 8:
399ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		{
400ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			unsigned opcode = TGSI_OPCODE_CONT;
401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (ctx->bc->chip_class == CAYMAN) {
402ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&cm_shader_tgsi_instruction[opcode];
404ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else if (ctx->bc->chip_class >= EVERGREEN) {
405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
406ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&eg_shader_tgsi_instruction[opcode];
407ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else {
408ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
409ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&r600_shader_tgsi_instruction[opcode];
410ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			tgsi_loop_brk_cont(ctx);
412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
414bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune	case 9:
41518617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		r600_break_from_byte_stream(ctx, &alu,
41618617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
41718617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		break;
418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
420ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
421ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
422ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
426ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_tex tex;
427ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
428ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.inst = bytes[bytes_read++];
429ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.resource_id = bytes[bytes_read++];
430ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_gpr = bytes[bytes_read++];
431ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_rel = bytes[bytes_read++];
432ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_gpr = bytes[bytes_read++];
433ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_rel = bytes[bytes_read++];
434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_x = bytes[bytes_read++];
435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_y = bytes[bytes_read++];
436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_z = bytes[bytes_read++];
437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_w = bytes[bytes_read++];
438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.lod_bias = bytes[bytes_read++];
439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_x = bytes[bytes_read++];
440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_y = bytes[bytes_read++];
441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_z = bytes[bytes_read++];
442ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_w = bytes[bytes_read++];
443ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_x = bytes[bytes_read++];
444ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_y = bytes[bytes_read++];
445ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_z = bytes[bytes_read++];
446ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.sampler_id = bytes[bytes_read++];
447ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_x = bytes[bytes_read++];
448ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_y = bytes[bytes_read++];
449ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_z = bytes[bytes_read++];
450ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_w = bytes[bytes_read++];
451ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
452ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_tex(ctx->bc, &tex);
453ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
454ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
455ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
456ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
457e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
458e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	unsigned char * bytes, unsigned bytes_read)
459e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{
460e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	struct r600_bytecode_vtx vtx;
4612c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4622c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read);
4632c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard        uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read);
4642c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read);
4652c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
466e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	memset(&vtx, 0, sizeof(vtx));
4672c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4682c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD0 */
4692c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0);
4702c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0);
4712c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0);
4722c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0);
4732c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0);
4742c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0);
4752c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4762c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD1 */
4772c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1);
4782c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1);
4792c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1);
4802c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1);
4812c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1);
4822c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1);
4832c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1);
4842c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1);
4852c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1);
4862c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1);
4872c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4882c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD 2*/
4892c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2);
4902c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2);
491e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
492e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
493e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		fprintf(stderr, "Error adding vtx\n");
494e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	}
495e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	/* Use the Texture Cache */
496e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
497e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	return bytes_read;
498e42df8e10a83e76565474f82330d34403da71b49Tom Stellard}
499e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
500ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
501ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes,	unsigned num_bytes)
502ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
503ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned bytes_read = 0;
5046f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard	unsigned i, byte;
505ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	while (bytes_read < num_bytes) {
506ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		char inst_type = bytes[bytes_read++];
507ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		switch (inst_type) {
508ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 0:
509ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_alu_from_byte_stream(ctx, bytes,
510ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
511ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
512ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 1:
513ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_tex_from_byte_stream(ctx, bytes,
514ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
515ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 2:
517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_fc_from_byte_stream(ctx, bytes,
518ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
519ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
5206f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard		case 3:
5216f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
5226f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			for (i = 0; i < 2; i++) {
5236f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				for (byte = 0 ; byte < 4; byte++) {
5246f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					ctx->bc->cf_last->isa[i] |=
5256f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					(bytes[bytes_read++] << (byte * 8));
5266f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				}
5276f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			}
5286f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			break;
529e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
530e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		case 4:
531e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
532e42df8e10a83e76565474f82330d34403da71b49Tom Stellard								bytes_read);
533e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			break;
534ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		default:
535ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			/* XXX: Error here */
536ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
537ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
538ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
539ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
540ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
541ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
55172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
555c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
556a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
56072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
561a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
5638260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
5648260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
5658260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
57047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
57147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
57672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
57772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
57950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
58050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
5814a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
582fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
583fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
584fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
585fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
586fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
587fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
588fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
589fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
590fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
591fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
592fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
593fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
595fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
596fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
597fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
6017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
60550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
60650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
6074a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
60850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
60950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
610738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
61150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
612738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
61350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
61450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
615fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
61650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
61750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
61850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
61950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
620fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
621fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
622fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
623fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
624fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
62550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
62650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
62750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
62850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
6294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
63050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
63150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
63250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
63350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
6347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
6357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
63621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
63721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
63821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
63921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
64021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
64121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
64221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
64321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
644738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
64521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
64621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
64721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
64821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
64921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
65021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
65221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
65321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
65521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
65621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
65721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
65821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
65921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
66021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
66121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
6627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
6630a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
6640a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
6650a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6660a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
6670a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
6680a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
6690a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
6700a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6710a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
6720a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
6730a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
6740a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
6750a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
6760a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
6770a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
6780a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
6790a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
6800a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6810a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6820a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
6830a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
6840a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
6850a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6860a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
6870a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
6880a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
6890a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
6900a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
6910a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
6920a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
6930a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6940a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
6955b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6965b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6975b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
6985b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
6995b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
7005b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
7015b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7025b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
7035b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
7045b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
7055b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
7065b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
7075b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
7085b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
7095b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
7105b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
7115b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
7125b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
7135b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
7145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
7155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
7165b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
7175b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7185b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
7195b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
7205b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
7215b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
7225b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
7235b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7245b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
7255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
7265b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
727725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
728725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
729725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
730725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
731725a820b926575265e6790601a0defd9c30947dcVadim Girlin
732725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
733725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
734725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
735725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
736725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
737725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
738725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
739725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
740725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
741725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
742725a820b926575265e6790601a0defd9c30947dcVadim Girlin
743725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
744725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
745725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
746725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
747725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
748725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
749725a820b926575265e6790601a0defd9c30947dcVadim Girlin
750725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
751725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
752725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
753725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
754725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
755725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
756725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
757725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
758725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
759725a820b926575265e6790601a0defd9c30947dcVadim Girlin
760725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
761725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
762725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
763725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
764725a820b926575265e6790601a0defd9c30947dcVadim Girlin
765725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
767725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
768725a820b926575265e6790601a0defd9c30947dcVadim Girlin
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
770725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
771725a820b926575265e6790601a0defd9c30947dcVadim Girlin
772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
77372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
77696bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
77772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
7835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
7841279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].interpolate = d->Interp.Interpolate;
7851279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].centroid = d->Interp.Centroid;
786024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
787725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
788c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			switch (ctx->shader->input[i].name) {
789c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_FACE:
790725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
791c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
792c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_COLOR:
793725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
794c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
795c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_POSITION:
796c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				ctx->fragcoord_input = i;
797c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
798c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			}
799725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
800c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				if ((r = evergreen_interp_input(ctx, i)))
801725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
802fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
80350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
8095b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
810024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
8111279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->output[i].interpolate = d->Interp.Interpolate;
81291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
81391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
81491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
81591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
81691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
81791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
81891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
81991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
820e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák				ctx->shader->vs_out_point_size = 1;
82191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
82254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
82354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
82454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
82554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
82691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
8270c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		} else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
8280c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			switch (d->Semantic.Name) {
8290c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			case TGSI_SEMANTIC_COLOR:
8300c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				ctx->shader->nr_ps_max_color_exports++;
8310c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				break;
8320c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			}
83391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
83733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
83847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
84096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
841c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
842c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
843951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			if (!ctx->native_integers) {
844951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				struct r600_bytecode_alu alu;
845951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
84696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
847951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
848951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].sel = 0;
849951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].chan = 3;
85096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
851951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.sel = 0;
852951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.chan = 3;
853951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.write = 1;
854951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.last = 1;
85596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
856951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
857951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin					return r;
858951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			}
859c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
86039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
86139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
86772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
86872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
869be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
870be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
871be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
872be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
873be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
8747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
875fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
876fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
877fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
878fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
879fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
880fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
881fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
882fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
883fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
884fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
885fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
886fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
887fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
888fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
889fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
890fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
891fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
892fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
893fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
894fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
895fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
896fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
897fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
898fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
899fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
900fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
901fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
902fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
903fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
904fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
905fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
906fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
907fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
908fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
909fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
910fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
911fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
912fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
913fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
914fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
915fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
916fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
917370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
918fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
919fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
920fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
9211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
9221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
9231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
9241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
9251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
9261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
9271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
9281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
9291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
9301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
9311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
93296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
9331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
9341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
9351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
9361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
9371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
9404a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
9411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
9421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
9431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
9441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
9451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
9461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
94796bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
94839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
94939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
95039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
95139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
95239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
95339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
95439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
95539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
95639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
95739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
95839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
95939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
96039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
961c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
9621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
9631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
9641fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
9651fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
9661fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
9671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
9681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
969077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
970077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
9714a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
972077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
973077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
9764a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
977077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
9818e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
982077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
983077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
984077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
987077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
989077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9904a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
992077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
993077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
994077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
9958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
997077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
998077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
1000077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
1001077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
1006077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
1011d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10134a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
1015077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1016077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
1017077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
1018077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10197687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
10207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10224a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
10247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
10267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
10277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
10287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
10307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
1032077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
1033077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
1034077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
1035077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1036077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
1037077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
1038077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
1039077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
1040077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1041077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
1042077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
1043077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
1044077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
10457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10474a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
10527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10574a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
10627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
10637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10734a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
10777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
10797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
10827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10854a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
10907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10954a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
11007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
11017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
11027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
11037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
11047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
11057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
1106725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1107725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
1108725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
1109725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1110725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
1111725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
1112725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
1113725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
1114725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1115725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1116725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1117725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
1118725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
1119725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1120725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
1121725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
1122725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
1123725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1124725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1125725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
1126725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1127725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
1128725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1129725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1130725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1131725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
1132725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1133725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
1134725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
1135725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
1136725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
1137725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1138725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1139725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
1140725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
1141725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
1142725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1143725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1144725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
1145725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
1146725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1147e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
114872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1149eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
11504acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct tgsi_token *tokens = pipeshader->selector->tokens;
11514acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct pipe_stream_output_info so = pipeshader->selector->so;
1152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
11535555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
1154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
11554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
1156457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
1157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
115854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
115954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
1160ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Declarations used by llvm code */
1161ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bool use_llvm = false;
11627f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned char * inst_bytes = NULL;
11637f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned inst_byte_count = 0;
116472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1165ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1166ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	use_llvm = debug_get_bool_option("R600_LLVM", TRUE);
1167ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
1169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
117015ca9d159e50815b0bfe60df8873f48c32a59ca5Marek Olšák	ctx.native_integers = true;
1171951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin
1172c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
1174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
1176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
1177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
1178f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1180725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
1181c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	ctx.fragcoord_input = -1;
1182725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
118354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
1184725a820b926575265e6790601a0defd9c30947dcVadim Girlin
11850c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_color_exports = 0;
11860c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_max_color_exports = 0;
11870c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1188725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1189feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
1191076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
1192076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
1193076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
1194f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
1195f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
1196f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
1197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
1198076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
1199076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
1200076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
1201076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
1202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
1203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
1204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
1205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
1206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
1207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
121689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
12174a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1218f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
12194a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1220f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
122289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1223fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
122484457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
1225ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1226ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* LLVM backend setup */
1227ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1228ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm && ctx.info.indirect_files) {
1229ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		fprintf(stderr, "Warning: R600 LLVM backend does not support "
1230ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"indirect adressing.  Falling back to TGSI "
1231ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"backend.\n");
1232ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		use_llvm = 0;
1233ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1234ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1235ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		struct radeon_llvm_context radeon_llvm_ctx;
1236ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		LLVMModuleRef mod;
1237ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned dump = 0;
1238ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx));
1239ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1240ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens);
1241ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
1242ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			dump = 1;
1243ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1244ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count,
1245ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard							rctx->family, dump)) {
1246ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			FREE(inst_bytes);
1247ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			radeon_llvm_dispose(&radeon_llvm_ctx);
1248ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			use_llvm = 0;
1249ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			fprintf(stderr, "R600 LLVM backend failed to compile "
1250ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"shader.  Falling back to TGSI\n");
1251ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		} else {
1252ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_OUTPUT] =
1253ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					ctx.file_offset[TGSI_FILE_INPUT];
1254ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1255ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_dispose(&radeon_llvm_ctx);
1256ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1257ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1258ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* End of LLVM backend setup */
1259ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1260ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (!use_llvm) {
1261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx.file_offset[TGSI_FILE_OUTPUT] =
1262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_INPUT] +
1263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
12664d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1267d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
126897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
126997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
127097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1271d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
12727728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
12738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
12744d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
12758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1277cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
1278cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
12795555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
1280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
1282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
1283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
1284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
1285cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1286cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
1287cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
1288cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
1289cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
1290cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1291cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1292cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1293cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
1295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
1302725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1303725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
1304725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
130591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
130691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1307725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
1308725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
130991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
131091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
131191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
131291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
131391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
1314725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1315725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1316725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
1317725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1318725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
1319725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
1320725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1321725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1322725a820b926575265e6790601a0defd9c30947dcVadim Girlin
13230c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (shader->fs_write_all && rctx->chip_class >= EVERGREEN)
13240c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		shader->nr_ps_max_color_exports = 8;
13250c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1326c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	if (ctx.fragcoord_input >= 0) {
1327cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		if (ctx.bc->chip_class == CAYMAN) {
1328cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			for (j = 0 ; j < 4; j++) {
1329cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				struct r600_bytecode_alu alu;
1330cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1331cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1332cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1333cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].chan = 3;
1334cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie
1335cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1336cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.chan = j;
1337cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.write = (j == 3);
1338cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.last = 1;
1339cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1340cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie					return r;
1341cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			}
1342cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		} else {
1343cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			struct r600_bytecode_alu alu;
1344cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1345cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1346cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1347cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].chan = 3;
1348c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1349cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1350cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.chan = 3;
1351cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.write = 1;
1352cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.last = 1;
1353cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1354cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				return r;
1355cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		}
1356c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	}
1357c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1358725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
1359725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
1360725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
1361725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1362725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1363725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
1364725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1365725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
1366725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
1367725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
1368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (use_llvm) {
1369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				continue;
1370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
1371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
1372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1374be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
1375be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
1376be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
13771fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
13787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
13797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
13807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
13817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
13827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
138389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
13847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
138589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
138650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
138750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
138850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
1390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1394725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1397eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1398ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Get instructions if we are using the LLVM backend. */
1399ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1400ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		FREE(inst_bytes);
1402ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1404457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
1405eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
140654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
140754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
140854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
140954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
141054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
141154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
141254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
141354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
141454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
141554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
141654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
141754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
14185a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		/* reset spi_sid for clipvertex output to avoid confusing spi */
14195a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		shader->output[ctx.cv_output].spi_sid = 0;
14205a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin
142154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
142254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
142354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
142454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
142554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
142654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
142754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
142854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
142954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
143054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
143154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
143254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
143354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
143454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
143554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
143654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
143754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
143854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
143954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
144054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
144154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
144254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
144354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
144454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
144554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
144654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
144754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
144854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
144954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1450543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1451543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1452543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1453543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1454543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1455543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1456543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1457543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1458543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1459543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1460543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
14618ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			if (so.output[i].dst_offset < so.output[i].start_component) {
14628ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
14632449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
14642449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1465543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1466543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1467543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1468543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1469543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
14708ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1474c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1475c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1476c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
14778ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1478543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1479543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1480543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1481543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1482543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1483543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1484543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1485543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1486543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1487543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1488543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1489543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1490543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1491543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1492543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1493543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1494543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1495543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1496543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1497543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1498543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1499543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1500543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1501543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1502543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1503543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1504543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1505543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1506543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1507543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1508543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1509543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1510543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1511543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1512543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1513543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1514543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1515eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
151654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
151754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
151854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
151954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
152054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
152154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
152254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
152354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
152454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
152554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
152654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
152754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1528457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
153091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
153191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
153254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
153354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
153491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
153591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
153691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
153954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
154054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
154154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
154291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
154391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
154454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
154554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
154654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
154754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
154854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
154954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
155054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
155154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
155254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
155591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
155613daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
155713daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
155813daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
155913daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
156013daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
15650c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				/* never export more colors than the number of CBs */
15660c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) {
15670c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					/* skip export */
15680c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					j--;
15690c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					continue;
15700c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				}
157154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
157254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
15730c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				shader->nr_ps_color_exports++;
15744f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
15750c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					for (k = 1; k < rctx->nr_cbufs; k++) {
157654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
157754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
157854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
157954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
158054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
158154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
158254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
158354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_w = 3;
158454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
158554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
158654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
158754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
15890c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin						shader->nr_ps_color_exports++;
1590feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1591feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
15925f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
159454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
159554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
159654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
159754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
159839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
160054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
160254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
160354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
161472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
161554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
161654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
161754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
161854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
161954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1620457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
162154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1622457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
162354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
162454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
162554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
162654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
162754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
162854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
162954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
163054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
163154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
163254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
163354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
163454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
163554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
163654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1637c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
163854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1639481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
16400c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) {
164154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
164254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
164354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
164454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
164554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
164654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
164754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
164854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
164954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
165054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
165154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
165254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
165354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1654481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
165554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
165654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
165754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1658457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1659457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
166089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
16617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
16627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
16637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1664457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1665b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1666b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1667a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1668c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1669c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1670457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1671457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
16724a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
167789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
16784a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1680783e4da72aa203a645737dec81b001341951a942Vadim Girlin	/* check GPR limit - we have 124 = 128 - 4
1681783e4da72aa203a645737dec81b001341951a942Vadim Girlin	 * (4 are reserved as alu clause temporary registers) */
1682783e4da72aa203a645737dec81b001341951a942Vadim Girlin	if (ctx.bc->ngpr > 124) {
1683783e4da72aa203a645737dec81b001341951a942Vadim Girlin		R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1684783e4da72aa203a645737dec81b001341951a942Vadim Girlin		r = -ENOMEM;
1685783e4da72aa203a645737dec81b001341951a942Vadim Girlin		goto out_err;
1686783e4da72aa203a645737dec81b001341951a942Vadim Girlin	}
1687783e4da72aa203a645737dec81b001341951a942Vadim Girlin
16883b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1692cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1699f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1700f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
17094a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1710a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1711a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1712a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1713a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1714a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1715a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1716a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1717a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1718a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1719a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1720a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
17214a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1722f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1723f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1724f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1725f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1726f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
17274a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
17283efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
17293efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
17303efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
17313efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
173280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
173380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
173480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
17354a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
17377a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17387a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
174347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
174447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
17457a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
17467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
17477a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1750dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1752dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1753d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1754d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1755dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1756d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1757d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1758d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1759dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1760dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1761dffad730df17983cfaef0808555a8c26cad0aa15Christian König
17629b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1763dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1764dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1766dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1767dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1769d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1770d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1771d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1772d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
17734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
177480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1776d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1777d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17794a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1781d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
17824a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
17834a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
17884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
17907a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
17914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
17927a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17969b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1806d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1807d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18089b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1809d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1810d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1811d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1812d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18139b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
18149b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
18159b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
18169b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
18179b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
18189b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1819d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1820d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1821cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1822cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1823cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1824cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1825cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1826cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1827cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1828cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1829cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1830cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1831cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1832cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1833cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1834cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1835cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1836cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1837cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1838cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1839cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1840cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1841cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1842cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1843cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1844cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1845cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1846cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1847cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1848cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1850cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1851cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
18527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
18537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
18547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
18564a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
18577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
18587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
18604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
18627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18634a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
18647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
18677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
18727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
18737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
18747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
18757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
18767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1877d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1878d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{
1879d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1880d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int i, j, k, r;
1881d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct r600_bytecode_alu alu;
1882d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1883d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	for (k = 0; k < last_slot; k++) {
1884d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1885d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			continue;
1886d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
1887d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		for (i = 0 ; i < 4; i++) {
1888d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1889d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.inst = ctx->inst_info->r600_opcode;
1890d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1891d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1892d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			}
1893d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1894d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.dst.write = (i == k);
1895d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (i == 3)
1896d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				alu.last = 1;
1897d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
1898d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (r)
1899d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				return r;
1900d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		}
1901d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	}
1902d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	return 0;
1903d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie}
1904d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
19057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
190688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
190788f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
190888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
190988f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
19101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
191188f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
191296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
191396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
191496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
191596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
191696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
19174a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
19194a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1920a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
192188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
192288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
192388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
192488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
192588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
192688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19274a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
19287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1929921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
193088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1931a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
193296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1933ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
193488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19354a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
193688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
193788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
193888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19394a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1940a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
19417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
194288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
194388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
194488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
194588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
194688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
194788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
194888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19494a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
195088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
195188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
195288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19534a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1954a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
195588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
195688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
195788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
195888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
195988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
196088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
196188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
196288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
19637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1964921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
196588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1966921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1967ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
196896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
196989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1970a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1971a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
197296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
197396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
197496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
197596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
197696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
197796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
197888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19794a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
198088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
198188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
198292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
198392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
198492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
19857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
19867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
19877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19884a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
19907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
19917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
19937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
19947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
19957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
19984a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
20007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
20017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
20047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
20067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20094a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
201692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
201792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
201892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20194a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
202092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
2021dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
202292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
202492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
202592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
202688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
20274a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
202888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
202988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
203088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
203188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
203288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
203388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
203488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
203588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
20364a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
203788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
203888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
203988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
204088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
2041be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
2042be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2043be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
2044be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
20454a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2046a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2047be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
2048be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
204980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2050be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
205188f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
20524a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
205388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
205488f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
205588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
205688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
205788f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
205888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
205992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
206092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
206192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20624a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
206492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
206557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
206657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
206757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
206857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
20691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
207057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
207157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
207257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
207392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
207492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
207557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
207689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
20784a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
20807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
20857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
20867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
20887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20904a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20954a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
20977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
209892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21024a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
210657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
210792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
210892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
210957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
211089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
21124a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
21167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
21187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
21197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
21207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
21217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21234a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21284a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
213157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
21327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
213957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
214092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2141ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
2142ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
21434a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2144ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2145ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2146ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
214780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2148ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2149ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
2150ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2151ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2152ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2153ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21544a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
2160ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
21614a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
216580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21724a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
217792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
217892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
217992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2180094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
2181094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
21824a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2183094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
2184094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
2185094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
21864a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2187094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
21884502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2189094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
21904502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2191921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
21924502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
21934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
21944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
21954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
21964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
21974a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
21984502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
2199094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
2200094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
2201094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
22024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2203094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
2204094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
2205094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
22064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
22074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
22084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
22094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
2210094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
2211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
2212094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
22130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
22140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
22150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
22170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
22180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
2219f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
22204a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2221f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
22224a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2223f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2224f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
2225f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2226f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
2227f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
2228f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
2229f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2230f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
22314a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2232f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
2233f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
2234f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
22350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
22360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
22376a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
22386a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
22397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
22406a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
224189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
2243f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
22444a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2246f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
2247f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
2248f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
2249f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
22507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
22517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
22547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
22557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22564a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
2261f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
22624a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2264f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
2265f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
22662fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
22672fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
22682fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22704a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
22756a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
22766a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
22770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
227886f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
22794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2280a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
228186f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
228286f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
22834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
22844a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
22850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
22860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
22870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
22880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
22890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
22904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
22910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
22920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
22930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
229489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
22974a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
23007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
23017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
23037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
23067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
23074a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
23087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
23134a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
23167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23194a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
23207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
23230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
2324abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23258567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
23264a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23278567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
23288567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
23298567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
23308567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
23318567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
23324a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
23338567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
23348567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
23358567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
2336abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
23374a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2338abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
23394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2340abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2341abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
2342abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2343abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
23444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2345abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2346abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2347abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
2348abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
23494a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2350abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2351abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
2352abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
2353abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2354abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
2355abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
23564a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2357abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2358abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2359abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
23610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
23620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
236342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
236442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
236542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23664a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
236742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
236842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
23694a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2370df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2371370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
2372df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2373df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
2374df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2375df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
2376df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
237742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
23784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
23794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
238042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
238142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
238242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
238342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
23844a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
238542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
238642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
238742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
238842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
238942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
239042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
2391a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
23927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
23937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23944a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2395a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
23967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
23977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
23984a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2400a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
24017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
240280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
24057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
24064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
24087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
24097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
24107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
24117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
24127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
2413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
2415a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
2418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24194a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
2421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
24224a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
2424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2425a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24274a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2428a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
2431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
24357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
24367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
24384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
24397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
24407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
24424a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
24457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
24467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
24477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
24487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
24497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
24564a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
24634a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
24647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
24667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
24694a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
24727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2485a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
24864a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
24904a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2491a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24924a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24964a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2497a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2498a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2499a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
25004a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
250166f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
25024a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2503a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25074a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2508a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2510a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
25114a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2512a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2513a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2514a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2516a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25174a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2518a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2519a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2522a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
25234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2524332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2525332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2526332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
252729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int i, r, j;
2528332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2529332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2530332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
25314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
253229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int tmp3 = r600_get_temp(ctx);
25334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
25344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
25364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
25384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
25394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2578332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2579332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2580332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2581332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2582332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2584332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2588332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2592332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2594332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2596332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2602332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2604332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2607332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2608332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2610332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2612332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
26184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2630332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2631332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
26324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
26374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2652332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
26534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2672332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2673332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
267529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
267629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp3.x = u2f(src2) */
267729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
267829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2679332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
268029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
268129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
268229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
268329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
268429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
268529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
268629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
268729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
268829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
268929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
269029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
269129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
269229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
269329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
269429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
269529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp0.x = recip(tmp3.x) */
269629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 3; j++) {
269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
269929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
270129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 0);
270329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp3;
270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (j == 2)
270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.last = 1;
270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
272029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].value = 0x4f800000;
272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
272529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (r)
272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
273429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
273529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp3;
273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
27424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
27464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
274829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
274929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
275229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
27624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
276429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
276529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
276629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
276729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2768332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
276929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
277029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
277129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
2772332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
277329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
277429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
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 = (j == 3);
278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
278429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
278529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
27864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2789332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
279029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
279229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
279329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
279429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
279529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
280329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
280429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
280629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
28074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
28094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
28114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
28144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
28174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
28194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
282529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
282629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
282729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
282829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
283029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
283129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
283229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
28334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
283429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
283529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
28364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
283729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
283829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
283929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
284029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
284129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
284229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
284329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
284429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
284529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
284629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
28474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2850332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
285129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
285229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
285329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
285529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
285629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
285829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
285929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
286229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
286429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
286729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
2869332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
28714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2874332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
28774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
28814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
28834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
28844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
28854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
289129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
289229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
289329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
289429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2895332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
289629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
289729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
289829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 3);
28994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
290029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
290129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 2;
29024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
290329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
290429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
290629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
290729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
290829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
290929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
291029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		} else {
291129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
291229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
291329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
291429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
291529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 3;
291629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
291729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
291829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
291929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 2;
292029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
292129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
292229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 0;
292329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
292429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
292529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
292629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
292729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
29284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
29304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2932332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2933332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2935332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2936332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
29414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2942332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2944332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2945332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2947332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2949332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2950332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2952332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2953332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2958332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2959332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2961332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2962332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
29644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
29664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2967332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
29694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
29704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
29714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
29744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
29754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
29764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
29774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
29784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
29804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
29824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
298429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
298529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
298629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
298729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
29884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
298929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
299029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
299129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
29924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
299329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
299429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
29954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
299629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
299729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
299829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 0;
299929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
300029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
300129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
300229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
300329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
300429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
300529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
300929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
30104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
301229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
301329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
301429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
301629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
301729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
301829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
302429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
302729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
303229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
303329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
303429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
303629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
303729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
303829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
30394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
304029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
304129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].sel = tmp2;
304229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].chan = 1;
304329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
304429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
304529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
304629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
304729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
304829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 2;
304929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
305029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
305129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
305229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
305329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
305529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
305629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
305829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
305929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
306029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
30614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
306229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
306329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
306429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
306529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
306629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
306729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
306829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
306929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
307029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 2;
307129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
307229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
307329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
307429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
307529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
30784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
30804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
30824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
30844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
30874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
30884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
30904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
30914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
30934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
30944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
30984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
31004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3102332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3103332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
31044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
3105332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
3106332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
31084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
31094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
31114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
31124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3115332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
3119332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
31214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
31254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
31274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
31364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3140332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3141332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
3143332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
3145332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3147332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3148332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
31494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
3150332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
3151332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
3154332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
31674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
31724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
31764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
31994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
32064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3219332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3221332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
3222332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
32284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3230332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
32414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
3242332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
3245332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
32484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3249332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
32554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
32714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3273332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3274332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
32794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
3280332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3283332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3284332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
32904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
32964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
33444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
33454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
33524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
33534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
33624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
33634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
3364332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
3365332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
3366332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
33684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
33704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
33734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
33754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
33784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
33804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
33834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
33854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3387a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3388a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
3389a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{
3390a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3391a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct r600_bytecode_alu alu;
3392a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int i, r;
3393a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3394a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
3395a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3396a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3397a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3398a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3399a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3400a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3401a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
3402a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3403a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.sel = ctx->temp_reg;
3404a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.chan = i;
3405a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.write = 1;
3406a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3407a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3408a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (i == last_inst)
3409a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3410a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3411a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3412a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3413a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3414a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3415a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3416a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3417a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3418a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3419a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3420a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = ctx->inst_info->r600_opcode;
3421a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3422a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3423a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3424a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].sel = ctx->temp_reg;
3425a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].chan = i;
3426a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3427cd97a5f660399212a23b6dcd02906231f2dc5525Dave Airlie		if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT)
3428a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3429a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3430a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3431a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3432a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3433a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3434a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	return 0;
3435a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin}
3436a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
34376b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
34386b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
34396b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
34406b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
34416b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
34426b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
34436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
34446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
34466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
34526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
34546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
34556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
34596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
34686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
34746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
34756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
34786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
34806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
34826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
34836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
34916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
34926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
349342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
349442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
349542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
349642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
349742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
349842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
349942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
350042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
350142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
350242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
350342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
350442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
350542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
350642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
350742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
350842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
350942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
351042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
351142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
351242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
351342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
351442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
351542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
351642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
351742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
351842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
351942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
352042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
352142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
352242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
352342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
352442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
352542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
352642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
352742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
352842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
352942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
353142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
353242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
353342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
353442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
353642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
353842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
353942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
354142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
354342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
354442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
354642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
354742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
354842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
354942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
355042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
355142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
355242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
355342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
35546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35560d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
35570d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
35580d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35594a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3560921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
35610d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35620d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
35630d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35644a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3565a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35660d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
3567cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
35680d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
3569cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
35700d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3572921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
35734a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
35740d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35750d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
35760d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
35774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
35780d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
35790d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
35800d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
35810d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35820d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
35830d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35844a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3585a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35860d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
358780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
35880d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35890d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3590cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
35910d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
35920d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3593921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
35940d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
35950d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35960d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
3597cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
35980d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35990d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
36000d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
36014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
36020d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
36030d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
36040d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
36050d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
36060d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
36070d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3608cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3609cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
36104a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3611cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
3612cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3613cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
36144a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3616a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
36176c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
3618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
3619a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
362080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
3622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
3623cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
3625cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
3626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
36274a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
3629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
3631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
3632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
3635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
3636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36374a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
3639dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
36417be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
36427be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
36437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
36447be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
36454a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36484a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36507be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
365180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
3653cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
3654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
36557be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
3656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
36627be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3665cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
3666cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
3667cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36684a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
3670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
36724a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3674cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36754a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3677a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
367880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3679cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
3680a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3681cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
3682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
3683cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
3684cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
3685921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3688cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3691921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3693cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3694cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3695e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3696e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3697e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3698e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3699e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3700e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3701e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3702cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
37084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
37127be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
37156415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
37166415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
37176415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37186415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37196415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3720192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3721192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
37226415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
37236415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37246415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
37256415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
37266415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
37276415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37286415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
37306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
373233241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
373333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
373496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
373533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37364a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
37374a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3738641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
373940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3741da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3742da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
37436415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
374478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
374513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
374678293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3747641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3749641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37501d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
37511d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
37521d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
37531d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
37541d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
37551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
37561d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
37571d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
37581d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
37591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
376013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
376113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
376213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
376340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
376440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
37654a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
376640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
376740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
376840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
376940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
377040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
377140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
377240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
377340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
377440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
377540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
377640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
377740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
377840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
37794a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
378040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
37814a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
378240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
378340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
378440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
378540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
378640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
37874a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
378840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
378940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
379040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
379113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
379240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
379340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
379440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
379540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
379640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
379740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
379840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
379940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
380040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
380140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
380240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
380340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
380440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
380540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
380640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
380740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
38084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
380940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
381040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
381113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
381213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
38137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3814b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
381589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
38177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38184a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38204a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
38277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
38354a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38374a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
38387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38434a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
38479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3848b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
38494a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3850a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3851b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
38534a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3854b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3856b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
38574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3858b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3859b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3860b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
38614a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3862a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3863921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3864b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
38694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
387278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3874bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3875bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38769783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
38779783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
3878261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ) {
3879261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
38800e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
38810e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3883bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3884bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
38854a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3886a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
38874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
38884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
38944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
390089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39024a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
39057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
39067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
39077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
39134a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39184a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
39217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
39227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
39237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
39257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
39274a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
39317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3932bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
39347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
39364a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3937a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3938bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3942bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3945bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3946bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3947a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3952bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3955bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3958a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3961bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39657ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3966bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3968a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
39754a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
39789783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
39799783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
39809783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39819783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
39829783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
39839783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
39849783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
39859783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
39869783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
39879783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
39889783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
39899783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
39909783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
399178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3992bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
3993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
399578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
3996b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
39974a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3998a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
39994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4000b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
4001b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
4002b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
4003b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
4004b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
40054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4006b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
4007b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
4008b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
400978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
4010b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
4011b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
40127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4013bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
4014929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4015929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
40166b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
40179783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
4018929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
4019929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
4020de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
4021de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
4022de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
4023de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4024de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
4025de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
4026de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4027c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
4028c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
4029c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
4030de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
4031de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
4032de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4033de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
4034de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
403533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
40364a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
4037bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
40386415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
40396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
4040077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
4041641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
40426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
40439d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
40449d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
40459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
40469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
404778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
404878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
404978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
405078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
405178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
405278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
405378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
405478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
405578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
405678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
4057244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
405878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
40599a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
4060bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
4061bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
4062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
4063bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
4064bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
4065bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
40669783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
40679783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
40689783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
40699783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
40709783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_w = 2; /* route Z compare value into W */
40719783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
4072bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40736b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
40746b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
407501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
407601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
407701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
40786b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
40796b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
4080bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
40821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
40831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
408469d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
4085929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
4086929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
4087929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
4088929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4089929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
40906b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
4091929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
4092929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
4093929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
409478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
4095929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
4096929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
4097929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
4098929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
4099929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
4100929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
4101929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
4102929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
4103929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
4104929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
4105929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
4106929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
4107929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
4108929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
4109929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
4110929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
4111929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
4112bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
41134a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
4114bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
4115bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
4116bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
4117bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
4118bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
411933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
412033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
4121b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
4122b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
4123b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41244a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4125dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4126b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
4127b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
4128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4129c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
41301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
4131c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
4132c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4133c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
4134c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
41354a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4136c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
41374a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
41384a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4139c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
414080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4141c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
4142c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
4143c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
4144c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
41454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4146c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
4147c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
4148c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
4149c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
4150c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
4151c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
4152b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
4153dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4154dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4155dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4156dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4158a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4159921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
4160b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
41614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
41624a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
4163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4164b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4165dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4167b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
41694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4170b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4171b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4173b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
4175dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4176dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4177dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4178dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4180a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
4182b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
41834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4185b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4186dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4187b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4189b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
41904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4191b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4192b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4193b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4194b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4195b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
4196dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4197dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4198dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4199dffad730df17983cfaef0808555a8c26cad0aa15Christian König
42004a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4201a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4202b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
42034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4205b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
4206b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
4207dffad730df17983cfaef0808555a8c26cad0aa15Christian König
420880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4209b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4210dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4211b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4212b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
42134a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4214b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4215b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4216b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4217dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
4218b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
4219b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
422087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
422187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
422287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42234a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
422487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
4225dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
422687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42277be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
42287be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
42297be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
423087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42314a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4232a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
42334a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
42354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
423680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
423787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
423887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
423987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
42407be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
424187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
42424a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
424387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
424487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
42457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
424687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
424787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
424887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
42500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
42510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42520e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
42530e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
42544a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
42550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
42560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
42570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
42590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
42600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
42624a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4263a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
42640e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
42654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
42664a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
42670e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
42680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
42690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
42700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
42710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
42720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
42730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
42750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
42760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
42770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
42790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
42804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
42810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
42820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
42830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
42840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
42864a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4287a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
42880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42890e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
42904a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
42914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
42920e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
42930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
42940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
42950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
42960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
42970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
42980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
43000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
43010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
43020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
43040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
430580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
430680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
43070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
43080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
43090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
43100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
43110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
43124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
43130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
43140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
43150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
43160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
43170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
43180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
43190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
43200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
432136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
432236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
432336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
43244a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
432509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
43267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
432736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
432836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
432936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
43304a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
433136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4332a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
43334a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
433436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
433536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
433636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
433736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
433836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
43394a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
434036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
434136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
434236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
434389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
43477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
434836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
43517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
43527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
43537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
43547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
43554a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
43597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
43607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
43627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
43637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
43657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
43667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
43677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
43684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
43697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
43707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
43717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
437236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
43737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
437436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
437536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
43764a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
437736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4378a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
43794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
438036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
438136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
4382b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
4383b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4384b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
4385b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
4386b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
438736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
438836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
438936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
439036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
439136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
439336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
439436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
439536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
439636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
439736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
439836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
439989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44014a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44034a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
440436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
44087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
441136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44124a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
44167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44174a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44194a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
442036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
44247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44274a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
443136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
443236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
443336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
443436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
44354a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
443636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4437a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
443836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
443936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
444036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
444136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
444236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
444336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
444436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
44454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
444636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
444736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
444836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
444936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
445036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
445187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
4452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
4453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
4454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
44554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
44577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
4458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4459f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
4460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
446189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44634a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44664a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44674a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
44687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
44727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
44747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44754a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
4479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44814a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44854a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
44867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
44897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4495460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
4498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4501460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
4502460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4503460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4506460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4507460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4508460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4510f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
451389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45154a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
451696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45184a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45194a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
452096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
45277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45334a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45374a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
45417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45444a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
454896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45494a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
455096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
455196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
455296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
455396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
455496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
455596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
455696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
455796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
455896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
455996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45604a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
456196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
456296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
456396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
456489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45664a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
45687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
45697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
45707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
457796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45784a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45834a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
45857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
45867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
458796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
45907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
459296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
459796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
459889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46004a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
46037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
46047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
46087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
46117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46124a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46174a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
462196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
462696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46274a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
463196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46324a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
463396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
463496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
463596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
463896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
463996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
464096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
4641460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4642460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4643460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
4644460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4645460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4646460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4648460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4649460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4650460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4651460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4652f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
4653460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
465489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46564a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46594a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46604a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
4661460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
4668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46694a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46744a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46784a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
46797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
46837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
46847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46854a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4689460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4690460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4691460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4692460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
46934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4694460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4695460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4696460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4697460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4698460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4699460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4700460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4701460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4702460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4703460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
47044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4705460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4706460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4707460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4708460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4709460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4710460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4711460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
471298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
471398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
471498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47154a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
471698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4717a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47184a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
471998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
472052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
472152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
472252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
472352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
472452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
472552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
472652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
47279b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
47288e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
47299b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
473052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
473152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
473252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
473352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
473452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
47358e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
473698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
47378e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
47388e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
47394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
474098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
474198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
47428e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
47438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
474498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
474598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
474698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
474747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
474847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47494a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
475047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4751a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
47537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4754077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4755077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
47564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47578e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4758077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4759077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4760077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47614a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4762077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4763077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4764077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4765077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
47668e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
47678e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4768077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4769077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4770077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47714a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4772077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
47737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
47747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4775077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4776077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
47774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47788e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4779077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4780077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4781077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47824a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4783077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
47847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
47859b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
47868e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
47878e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
47888e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47898e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
47908e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
47918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
47928e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
47938e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
47948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
47959b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
47967ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
47977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
47987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
47997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
48007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48018e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
480247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
480347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
480447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
480557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
480657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
480757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
48084a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
480957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
481057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
481157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
48124a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
481357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4814a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
481580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
48167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
481857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
481957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48204a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
482157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
482257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4823a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
482457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
482557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48264a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
482757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
482857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
482957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
48304a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
483157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
483257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
483357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
483457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
483557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
483657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4837a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4838a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48394a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4840a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4841a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48424a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4843a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4844a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
4845a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4846a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4847a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4848a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4849a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48504a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4851a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4852a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
48537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4854a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4855a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48564a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4857a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4858a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4859a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4861a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4862a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4863a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48642bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
48652bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
48662bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
48672bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
48682bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
48694f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
48702bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
48714f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
48722bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
48732bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
48742bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
48752bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
48764f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
48772bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
48782bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
48794f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
48802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
48812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
48822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
48832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
48842bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
48852bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
48862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
48874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
48888813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
48898813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
48908813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
48912bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4892a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4893a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4894a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
489509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4896a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
489709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
489809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
489909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
490009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
490109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
490209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
490309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
490409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
490509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
490609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
490709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
490809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
490909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
491009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4911a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
491209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
491309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
491409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
491509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
491609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
491709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
491809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
491909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
492009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
492109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
492209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4923a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4924a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4925a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
492609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
492709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
492809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
492909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
493009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
493109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
493209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
49337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
493409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
493509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
493709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
493809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
493909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
494009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
494409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
494809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
495109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
495209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
495309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
495609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49584a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
49594a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4963a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
496409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
496509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4966a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
497309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
497409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
497809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
498009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
498109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
49874f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
499309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49944f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
4996370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX work out offset */
499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
499809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4999a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
500009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
500109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
500209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
500309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
500409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
500509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
500809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
500909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
501009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
501109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
501209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
501309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
501409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
501509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
501609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
501709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
501809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
501909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
502009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
502109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
502209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50234a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
502409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
502509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
502809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
503309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50348b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
503509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50364a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
503709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
5041a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5042a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5043a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5044a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
5045a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
50464a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
5047a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
5048a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
504909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
5050a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
5051a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5052a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5053a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5054a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
5055a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
5056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
5057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
5058a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
5059a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
5060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
5061a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5062a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
5063a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5064a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
5065a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
506609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
5067a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
506809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
506909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
507009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
507109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
507209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
507309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
507409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
507509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50764a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
507709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
507809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
5079a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
508009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
508109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
508209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
508309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
508409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
508509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
508609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
508709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
508809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50894a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
509009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
509109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
509209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
509309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
509409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
509509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
509609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
509709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
509809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
509909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
510009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
510109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
510209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
510309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
510409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
510509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
510609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
510709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
5108370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX add LOOPRET support */
510909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
511009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
511109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
511209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
511309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
511509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
511609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
511709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
511909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
512009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
512109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
512209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
512309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
512409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
512509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
512609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
512709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
512809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
51294a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
513009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
513109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
513209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
513309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5134a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5135a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5136a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5137cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
5138cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
5139cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5140cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
5141cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
5142cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
5143cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5144cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
5145cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5146cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5147cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5148cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5149cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5150cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5151cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
5152cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
5153cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
5154cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5155c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
5156cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
5157cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5158cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5159cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
51609b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
5161cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5162cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5163cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5164cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5165cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5166cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5167cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5168cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5169cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5170cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5171cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5172cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5173cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5174c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5175cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5176cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
5177cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
5178cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5179cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5180cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
5181cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
5182cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5183cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5184cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5185cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5186cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5187cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
5188cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
5189cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
519198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
51930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5194df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
5195370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
5196df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
5197df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
5198df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
5199df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
5200df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
520142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
520236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5203460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5206cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5207cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
520857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5209dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5211d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5212be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5215b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52233af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52253af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5226df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
52277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
52284558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5229a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
52300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52337a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5235e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
523688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
52373af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
52383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
52394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52450d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52470d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
524888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5249d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
52500d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5252b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
525313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5254b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52619f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52650d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
526687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
526792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5268c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5271cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5272ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
527309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5274a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5278a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5279a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52858c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5286c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5287cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
52880ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5289d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
5290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5292c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5293c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
52944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5295cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
52981d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
529909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
530209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
530409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5321094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5325bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
5326332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5327c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5328c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
53295893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5330c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5331d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
53320196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5333c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
53349a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5335c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
53364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5337c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5338c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5339c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
53404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5341850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5342c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5343c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5344d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
53457383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5346c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
5347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5351cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5352a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,  0, 0, tgsi_unsupported},
5353a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
5354cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5355cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5356cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5357cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5358cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5359cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5360a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5361cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5362cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
53639b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
53649b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
53656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
536642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
536950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
537050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
537198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
537250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
537350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
537450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
53758ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
537650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5377112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
537850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
537950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
538050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
538150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
538250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
538350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
538450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
538550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
538650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
538750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
538850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
538950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
539050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
539150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
539250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
539350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
539450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
539550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
539650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
539750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
539850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
539950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5400df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
540150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
540250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
540350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
540450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
540550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
540650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
540750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
540850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
540950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
541050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
541150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
541250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
541350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
541450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
542050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
542250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
542350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
542450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
542550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
542713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
542850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
542950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
54367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
54407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
54417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5442c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
54437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
54477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
54487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
54497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
54537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
54547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54598c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5460608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
54627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5463d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
54647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5467cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
54684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
54707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54711d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
54721d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
54737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
54747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
54777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
54967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
54977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5499a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
5500332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5501cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5502cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5503cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5504cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5505d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5506cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5507a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
5508b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5509cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
55104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5511cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5512cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5513cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
55144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
55159b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5516cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5517cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5518d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
55197383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5520cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
55217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5525cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5526a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5527a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5528cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5529cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5530cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5531cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5532cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5533cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5534a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5535cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5536cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
55379b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
55389b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
55396b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
554042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
55417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
55437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
55447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
55457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
55467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
55487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
55497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
55507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
55517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
55527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
55537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
55577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
55587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
55597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
55607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
55617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
55627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
55647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
55727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5574df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
55757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
55767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
55777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
55787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
55797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
55857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
55867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
55877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
55887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
55947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
55967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
55977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
55987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
55997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
560113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
56027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
56037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
561050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
561450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
561550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5616c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
561750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5620ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
562150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
562250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
562350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
562450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
562750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
562850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
562950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56338c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5634f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5635cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
56360ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5637f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
563850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
563950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5640f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5641f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
564229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5643cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
564450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56451d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
56461d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
564750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
564850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
565150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
565550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
566150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
567050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
567150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
567250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5673f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
567429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5675cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5676cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5677f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5678f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5679f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5680f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5681f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5682f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5683f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
568429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5685f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5686f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5687f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
568829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5689d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5690f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5691f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5692f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5693f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5694f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
569550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5699cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5700a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5701a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5702cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5703cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5704cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5705cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5706cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5707cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5708a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5709cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5710cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5711f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
57129b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5713f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5714f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
571550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
571650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5717