r600_shader.c revision da676eab93e7dad30b574b4eb4cffd4df952e819
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++];
313da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.pred_sel = 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;
333da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu->execute_mask = 1;
334da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu->update_pred = 1;
335b4789860c4416ba700ac5edeb692b59e33d45276Tom Stellard	alu->dst.write = 0;
336ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].sel = V_SQ_ALU_SRC_0;
337ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].chan = 0;
338ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->last = 1;
339ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_alu_type(ctx->bc, alu,
340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	fc_pushlevel(ctx, FC_IF);
344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			struct r600_bytecode_alu *alu, unsigned compare_opcode)
349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned opcode = TGSI_OPCODE_BRK;
351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (ctx->bc->chip_class == CAYMAN)
352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else if (ctx->bc->chip_class >= EVERGREEN)
354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else
356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	llvm_if(ctx, alu, compare_opcode);
358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_loop_brk_cont(ctx);
359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_endif(ctx);
360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst;
367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0);
369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst = bytes[bytes_read++];
370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	switch (inst) {
3712fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 0: /* FC_IF */
372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		llvm_if(ctx, &alu,
373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3752fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 1: /* FC_IF_INT */
376bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		llvm_if(ctx, &alu,
377bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3792fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 2: /* FC_ELSE */
380bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_else(ctx);
381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3822fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 3: /* FC_ENDIF */
383bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endif(ctx);
384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3852fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 4: /* FC_BGNLOOP */
386bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_bgnloop(ctx);
387ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3882fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 5: /* FC_ENDLOOP */
389bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endloop(ctx);
390ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3912fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 6: /* FC_BREAK */
392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
393bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
394ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3952fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 7: /* FC_BREAK_NZ_INT */
396bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		r600_break_from_byte_stream(ctx, &alu,
3972fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
398bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		break;
3992fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 8: /* FC_CONTINUE */
400ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		{
401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			unsigned opcode = TGSI_OPCODE_CONT;
402ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (ctx->bc->chip_class == CAYMAN) {
403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
404ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&cm_shader_tgsi_instruction[opcode];
405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else if (ctx->bc->chip_class >= EVERGREEN) {
406ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
407ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&eg_shader_tgsi_instruction[opcode];
408ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else {
409ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
410ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&r600_shader_tgsi_instruction[opcode];
411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			tgsi_loop_brk_cont(ctx);
413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
4152fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 9: /* FC_BREAK_Z_INT */
41618617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		r600_break_from_byte_stream(ctx, &alu,
41718617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
41818617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		break;
4192fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 10: /* FC_BREAK_NZ */
4202fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard		r600_break_from_byte_stream(ctx, &alu,
4212fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
4222fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard		break;
423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
426ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
427ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
428ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
429ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
430ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
431ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_tex tex;
432ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
433ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.inst = bytes[bytes_read++];
434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.resource_id = bytes[bytes_read++];
435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_gpr = bytes[bytes_read++];
436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_rel = bytes[bytes_read++];
437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_gpr = bytes[bytes_read++];
438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_rel = bytes[bytes_read++];
439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_x = bytes[bytes_read++];
440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_y = bytes[bytes_read++];
441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_z = bytes[bytes_read++];
442ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_w = bytes[bytes_read++];
443ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.lod_bias = bytes[bytes_read++];
444ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_x = bytes[bytes_read++];
445ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_y = bytes[bytes_read++];
446ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_z = bytes[bytes_read++];
447ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_w = bytes[bytes_read++];
448ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_x = bytes[bytes_read++];
449ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_y = bytes[bytes_read++];
450ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_z = bytes[bytes_read++];
451ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.sampler_id = bytes[bytes_read++];
452ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_x = bytes[bytes_read++];
453ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_y = bytes[bytes_read++];
454ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_z = bytes[bytes_read++];
455ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_w = bytes[bytes_read++];
456ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
457ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_tex(ctx->bc, &tex);
458ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
459ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
460ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
461ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
462e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
463e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	unsigned char * bytes, unsigned bytes_read)
464e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{
465e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	struct r600_bytecode_vtx vtx;
4662c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4672c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read);
4682c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard        uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read);
4692c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read);
4702c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
471e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	memset(&vtx, 0, sizeof(vtx));
4722c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4732c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD0 */
4742c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0);
4752c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0);
4762c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0);
4772c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0);
4782c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0);
4792c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0);
4802c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4812c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD1 */
4822c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1);
4832c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1);
4842c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1);
4852c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1);
4862c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1);
4872c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1);
4882c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1);
4892c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1);
4902c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1);
4912c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1);
4922c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4932c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD 2*/
4942c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2);
4952c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2);
496e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
497e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
498e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		fprintf(stderr, "Error adding vtx\n");
499e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	}
500e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	/* Use the Texture Cache */
501e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
502e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	return bytes_read;
503e42df8e10a83e76565474f82330d34403da71b49Tom Stellard}
504e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
505ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
506ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes,	unsigned num_bytes)
507ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
508ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned bytes_read = 0;
5096f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard	unsigned i, byte;
510ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	while (bytes_read < num_bytes) {
511ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		char inst_type = bytes[bytes_read++];
512ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		switch (inst_type) {
513ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 0:
514ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_alu_from_byte_stream(ctx, bytes,
515ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 1:
518ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_tex_from_byte_stream(ctx, bytes,
519ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
520ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
521ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 2:
522ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_fc_from_byte_stream(ctx, bytes,
523ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
524ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
5256f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard		case 3:
5266f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
5276f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			for (i = 0; i < 2; i++) {
5286f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				for (byte = 0 ; byte < 4; byte++) {
5296f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					ctx->bc->cf_last->isa[i] |=
5306f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					(bytes[bytes_read++] << (byte * 8));
5316f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				}
5326f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			}
5336f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			break;
534e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
535e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		case 4:
536e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
537e42df8e10a83e76565474f82330d34403da71b49Tom Stellard								bytes_read);
538e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			break;
539ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		default:
540ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			/* XXX: Error here */
541ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
542ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
543ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
544ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
545ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
546ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
55672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
560c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
561a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
56572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
566a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
5688260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
5698260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
5708260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
57547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
57647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
58172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
58272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
583fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
58450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
58550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
5864a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
587fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
588fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
589fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
590fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
591fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
592fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
593fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
595fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
596fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
597fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
601fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
605fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
6067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
607fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
608fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
609fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
61050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
61150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
6124a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
61350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
61450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
615738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
61650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
617738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
61850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
61950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
620fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
62150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
62250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
62350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
62450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
625fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
626fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
627fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
628fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
629fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
63050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
63150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
63250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
63350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
6344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
63550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
63650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
63750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
63850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
6397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
6407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
64121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
64221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
64321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
64421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
64521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
64621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
64721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
64821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
649738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
65021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
65221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
65321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
65521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
65721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
65821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
66021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
66121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
66221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
66321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
66421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
66521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
66621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
6677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
6680a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
6690a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
6700a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6710a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
6720a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
6730a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
6740a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
6750a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6760a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
6770a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
6780a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
6790a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
6800a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
6810a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
6820a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
6830a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
6840a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
6850a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6860a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6870a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
6880a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
6890a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
6900a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6910a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
6920a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
6930a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
6940a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
6950a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
6960a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
6970a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
6980a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6990a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
7005b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7015b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7025b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
7035b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
7045b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
7055b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
7065b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7075b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
7085b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
7095b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
7105b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
7115b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
7125b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
7135b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
7145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
7155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
7165b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
7175b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
7185b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
7195b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
7205b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
7215b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
7225b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7235b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
7245b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
7255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
7265b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
7275b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
7285b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
7305b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
7315b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
732725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
733725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
734725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
735725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
736725a820b926575265e6790601a0defd9c30947dcVadim Girlin
737725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
738725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
739725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
740725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
741725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
742725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
743725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
744725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
745725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
746725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
747725a820b926575265e6790601a0defd9c30947dcVadim Girlin
748725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
749725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
750725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
751725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
752725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
753725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
754725a820b926575265e6790601a0defd9c30947dcVadim Girlin
755725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
756725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
757725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
758725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
759725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
760725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
761725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
762725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
763725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
764725a820b926575265e6790601a0defd9c30947dcVadim Girlin
765725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
767725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
768725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin
770725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
771725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
772725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
773725a820b926575265e6790601a0defd9c30947dcVadim Girlin
774725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
775725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
776725a820b926575265e6790601a0defd9c30947dcVadim Girlin
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
77872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
78196bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
78272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
7885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
7891279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].interpolate = d->Interp.Interpolate;
7901279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].centroid = d->Interp.Centroid;
791024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
792725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
793c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			switch (ctx->shader->input[i].name) {
794c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_FACE:
795725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
796c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
797c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_COLOR:
798725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
799c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
800c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_POSITION:
801c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				ctx->fragcoord_input = i;
802c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
803c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			}
804725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
805c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				if ((r = evergreen_interp_input(ctx, i)))
806725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
807fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
80850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
8145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
815024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
8161279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->output[i].interpolate = d->Interp.Interpolate;
81791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
81891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
81991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
82091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
82191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
82291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
82391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
82491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
825e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák				ctx->shader->vs_out_point_size = 1;
82691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
82754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
82854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
82954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
83054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
83191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
8320c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		} else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
8330c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			switch (d->Semantic.Name) {
8340c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			case TGSI_SEMANTIC_COLOR:
8350c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				ctx->shader->nr_ps_max_color_exports++;
8360c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				break;
8370c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			}
83891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
84233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
84347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
84596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
846c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
847c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
848951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			if (!ctx->native_integers) {
849951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				struct r600_bytecode_alu alu;
850951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
85196bbc627f369c0100b950f81531b1fe9ef586c34Christian König
852951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
853951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].sel = 0;
854951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].chan = 3;
85596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
856951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.sel = 0;
857951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.chan = 3;
858951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.write = 1;
859951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.last = 1;
86096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
861951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
862951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin					return r;
863951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			}
864c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
86539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
86639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
87272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
87372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
876be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
877be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
878be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
8797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
880fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
881fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
882fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
883fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
884fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
885fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
886fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
887fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
888fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
889fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
890fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
891fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
892fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
893fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
894fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
895fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
896fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
897fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
898fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
899fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
900fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
901fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
902fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
903fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
904fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
905fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
906fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
907fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
908fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
909fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
910fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
911fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
912fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
913fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
914fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
915fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
916fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
917fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
918fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
919fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
920fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
921fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
922370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
923fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
924fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
925fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
9261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
9271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
9281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
9291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
9301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
9311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
9321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
9331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
9341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
9351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
9361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
93796bbc627f369c0100b950f81531b1fe9ef586c34Christian König
9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
9401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
9411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
9421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
9431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
9454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
9461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
9471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
9481fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
9491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
9501fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
9511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
95296bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
95339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
95439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
95539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
95639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
95739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
95839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
95939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
96039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
96139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
96239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
96339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
96439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
96539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
966c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
9671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
9681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
9691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
9701fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
9711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
9721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
9731fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
9764a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
977077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
9814a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
982077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
983077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
984077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
9868e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
987077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
989077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
990077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
992077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
993077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
994077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9954a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
997077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
998077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
10008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
1001077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
1006077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
1011077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
1013077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
1015077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
1016d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
1017077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10184a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
1019077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
1020077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1021077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
1022077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
1023077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10247687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
10257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10274a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
10297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
10317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
10327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
10337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
1037077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
1038077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
1039077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
1040077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1041077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
1042077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
1043077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
1044077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
1045077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1046077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
1047077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
1048077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
1049077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
10507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10524a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
10577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10624a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
10737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
10767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10784a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
10807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
10827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
10847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
10877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10904a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
10957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
11004a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
11017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
11027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
11037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
11047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
11057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
11067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
11077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
11087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
11097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
11107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
1111725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1112725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
1113725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
1114725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1115725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
1116725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
1117725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
1118725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
1119725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1120725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1121725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1122725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
1123725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
1124725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1125725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
1126725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
1127725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
1128725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1129725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1130725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
1131725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1132725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
1133725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1134725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1135725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1136725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
1137725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1138725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
1139725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
1140725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
1141725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
1142725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1143725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1144725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
1145725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
1146725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
1147725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1148725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1149725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
1150725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
1151725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1152e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
115372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1154eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
11554acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct tgsi_token *tokens = pipeshader->selector->tokens;
11564acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct pipe_stream_output_info so = pipeshader->selector->so;
1157de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
11585555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
1159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
11604a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
1161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
1162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
116354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
116454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
1165ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Declarations used by llvm code */
1166ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bool use_llvm = false;
11677f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned char * inst_bytes = NULL;
11687f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned inst_byte_count = 0;
116972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1170ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1171ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	use_llvm = debug_get_bool_option("R600_LLVM", TRUE);
1172ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
1174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
117515ca9d159e50815b0bfe60df8873f48c32a59ca5Marek Olšák	ctx.native_integers = true;
1176951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin
1177c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
1182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
1183f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1185725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
1186c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	ctx.fragcoord_input = -1;
1187725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
118854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
1189725a820b926575265e6790601a0defd9c30947dcVadim Girlin
11900c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_color_exports = 0;
11910c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_max_color_exports = 0;
11920c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1193725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1194feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
1196076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
1197076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
1198076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
1199f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
1200f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
1201f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
1202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
1203076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
1204076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
1205076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
1206076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
1207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
1214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
1215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
122189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
12224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1223f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
12244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1225f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
122789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1228fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
122984457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
1230ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1231ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* LLVM backend setup */
1232ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1233ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm && ctx.info.indirect_files) {
1234ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		fprintf(stderr, "Warning: R600 LLVM backend does not support "
1235ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"indirect adressing.  Falling back to TGSI "
1236ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"backend.\n");
1237ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		use_llvm = 0;
1238ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1239ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1240ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		struct radeon_llvm_context radeon_llvm_ctx;
1241ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		LLVMModuleRef mod;
1242ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned dump = 0;
1243ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx));
1244ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1245ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens);
1246ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
1247ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			dump = 1;
1248ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1249ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count,
1250ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard							rctx->family, dump)) {
1251ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			FREE(inst_bytes);
1252ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			radeon_llvm_dispose(&radeon_llvm_ctx);
1253ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			use_llvm = 0;
1254ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			fprintf(stderr, "R600 LLVM backend failed to compile "
1255ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"shader.  Falling back to TGSI\n");
1256ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		} else {
1257ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_OUTPUT] =
1258ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					ctx.file_offset[TGSI_FILE_INPUT];
1259ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1260ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_dispose(&radeon_llvm_ctx);
1261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* End of LLVM backend setup */
1264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (!use_llvm) {
1266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx.file_offset[TGSI_FILE_OUTPUT] =
1267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_INPUT] +
1268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
12714d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1272d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
127397e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
127497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
127597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1276d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
12777728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
12788e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
12794d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
12808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1282cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
1283cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
12845555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
1285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
1287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
1288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
1289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
1290cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1291cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
1292cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
1293cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
1294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
1295cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1296cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1297cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1298cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1299cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
1302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
1303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
1307725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1308725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
1309725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
131091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
131191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1312725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
1313725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
131491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
131591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
131691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
131791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
131891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
1319725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1320725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1321725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
1322725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1323725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
1324725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
1325725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1326725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1327725a820b926575265e6790601a0defd9c30947dcVadim Girlin
13280c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (shader->fs_write_all && rctx->chip_class >= EVERGREEN)
13290c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		shader->nr_ps_max_color_exports = 8;
13300c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1331c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	if (ctx.fragcoord_input >= 0) {
1332cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		if (ctx.bc->chip_class == CAYMAN) {
1333cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			for (j = 0 ; j < 4; j++) {
1334cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				struct r600_bytecode_alu alu;
1335cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1336cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1337cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1338cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].chan = 3;
1339cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie
1340cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1341cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.chan = j;
1342cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.write = (j == 3);
1343cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.last = 1;
1344cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1345cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie					return r;
1346cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			}
1347cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		} else {
1348cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			struct r600_bytecode_alu alu;
1349cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1350cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1351cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1352cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].chan = 3;
1353c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1354cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1355cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.chan = 3;
1356cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.write = 1;
1357cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.last = 1;
1358cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1359cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				return r;
1360cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		}
1361c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	}
1362c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1363725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
1364725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
1365725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
1366725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1367725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1368725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
1369725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1370725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
1371725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
1372725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
1373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (use_llvm) {
1374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				continue;
1375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
1376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
1377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1379be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
1380be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
1381be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
13821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
13837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
13847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
13857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
13867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
13877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
138889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
139089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
139150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
139250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
139350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
1395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1399725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1402eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Get instructions if we are using the LLVM backend. */
1404ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1406ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		FREE(inst_bytes);
1407ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1408ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1409457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
1410eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
141154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
141254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
141354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
141454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
141554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
141654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
141754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
141854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
141954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
142054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
142154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
142254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
14235a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		/* reset spi_sid for clipvertex output to avoid confusing spi */
14245a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		shader->output[ctx.cv_output].spi_sid = 0;
14255a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin
142654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
142754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
142854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
142954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
143054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
143154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
143254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
143354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
143454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
143554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
143654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
143754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
143854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
143954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
144054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
144154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
144254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
144354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
144454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
144554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
144654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
144754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
144854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
144954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
145054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
145154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
145254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
145354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
145454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1455543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1456543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1457543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1458543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1459543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1460543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1461543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1462543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1463543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1464543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1465543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
14668ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			if (so.output[i].dst_offset < so.output[i].start_component) {
14678ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
14682449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
14692449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1470543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1474543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
14758ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1476543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1477543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1478543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1479c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1480c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1481c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
14828ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1483543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1484543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1485543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1486543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1487543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1488543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1489543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1490543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1491543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1492543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1493543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1494543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1495543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1496543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1497543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1498543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1499543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1500543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1501543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1502543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1503543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1504543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1505543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1506543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1507543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1508543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1509543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1510543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1511543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1512543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1513543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1514543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1515543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1516543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1517543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1518543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1519543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1520eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
152154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
152254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
152354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
152454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
152554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
152654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
152754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
152854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
152954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
153054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
153154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
153254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1533457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
153591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
153691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
153991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
154091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
154191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
154454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
154554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
154654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
154791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
154891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
154954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
155054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
155154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
155254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
155554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
155654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
155854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
155954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
156091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
156113daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
156213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
156313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
156413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
156513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
15700c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				/* never export more colors than the number of CBs */
15710c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) {
15720c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					/* skip export */
15730c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					j--;
15740c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					continue;
15750c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				}
157626cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák				output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
157754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
157854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
15790c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				shader->nr_ps_color_exports++;
15804f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
15810c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					for (k = 1; k < rctx->nr_cbufs; k++) {
158254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
158354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
158454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
158554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
158654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
158754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
158926cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák						output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
159054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
159154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
159254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
159454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
15950c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin						shader->nr_ps_color_exports++;
1596feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1597feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
15985f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
160054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
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;
160439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
160554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
160654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
160754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
160854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
160954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
162072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
162154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
162254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
162354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
162454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
162554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1626457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
162754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1628457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
162954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
163054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
163154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
163254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
163354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
163454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
163554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
163654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
163754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
163854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
163954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
164054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
164154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
164254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1643c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
164454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1645481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
16460c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) {
164754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
164854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
164954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
165054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
165154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
165254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
165354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
165454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
165554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
165654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
165754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
165854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
165954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1660481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
166154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
166254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
166354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1664457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1665457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
166689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1670457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1671b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1672b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1673a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1674c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1675c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1676457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1677457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
16784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
168389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
16844a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
16857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1686783e4da72aa203a645737dec81b001341951a942Vadim Girlin	/* check GPR limit - we have 124 = 128 - 4
1687783e4da72aa203a645737dec81b001341951a942Vadim Girlin	 * (4 are reserved as alu clause temporary registers) */
1688783e4da72aa203a645737dec81b001341951a942Vadim Girlin	if (ctx.bc->ngpr > 124) {
1689783e4da72aa203a645737dec81b001341951a942Vadim Girlin		R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1690783e4da72aa203a645737dec81b001341951a942Vadim Girlin		r = -ENOMEM;
1691783e4da72aa203a645737dec81b001341951a942Vadim Girlin		goto out_err;
1692783e4da72aa203a645737dec81b001341951a942Vadim Girlin	}
1693783e4da72aa203a645737dec81b001341951a942Vadim Girlin
16943b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1698cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1705f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1706f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
17154a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1716a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1717a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1718a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1719a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1720a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1721a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1722a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1723a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1724a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1725a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1726a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
17274a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1728f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1729f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1730f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1731f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1732f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
17334a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
17343efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
17353efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
17363efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
17373efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
173880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
173980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
174080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
17414a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
17437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17447a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
174947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
175047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
17517a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
17527a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
17537a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1756dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1758dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1759d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1760d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1761dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1762d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1763d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1764d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1765dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1766dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1767dffad730df17983cfaef0808555a8c26cad0aa15Christian König
17689b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1769dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1770dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17714a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1772dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1773dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1775d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1776d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1777d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1778d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
17794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
178080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17817ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1782d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1783d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17854a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1787d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
17884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
17894a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
17944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
17967a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
17974a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
17987a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18029b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1812d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1813d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18149b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1815d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1816d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1817d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1818d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18199b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
18209b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
18219b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
18229b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
18239b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
18249b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1825d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1826d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1827cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1828cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1829cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1830cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1831cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1832cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1833cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1834cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1835cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1836cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1837cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1838cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1839cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1840cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1841cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1842cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1843cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1844cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1845cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1846cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1847cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1848cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1850cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1851cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1852cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1853cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1854cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1855cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1856cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1857cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
18587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
18597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
18607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
18624a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
18637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
18647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
18664a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
18687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
18737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
18757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
18787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
18797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
18807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
18817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
18827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1883d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1884d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{
1885d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1886d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int i, j, k, r;
1887d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct r600_bytecode_alu alu;
1888d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1889d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	for (k = 0; k < last_slot; k++) {
1890d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1891d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			continue;
1892d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
1893d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		for (i = 0 ; i < 4; i++) {
1894d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1895d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.inst = ctx->inst_info->r600_opcode;
1896d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1897d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1898d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			}
1899d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1900d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.dst.write = (i == k);
1901d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (i == 3)
1902d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				alu.last = 1;
1903d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
1904d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (r)
1905d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				return r;
1906d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		}
1907d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	}
1908d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	return 0;
1909d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie}
1910d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
19117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
191288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
191388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
191488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
191588f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
19161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
191788f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
191896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
191996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
192096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
192196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
192296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
19234a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
19254a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1926a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
192788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
192888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
192988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
193088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
193188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
193288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19334a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
19347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1935921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
193688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1937a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
193896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1939ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
194088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19414a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
194288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
194388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
194488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19454a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1946a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
19477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
194888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
194988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
195088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
195188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
195288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
195388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
195488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19554a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
195688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
195788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
195888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19594a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1960a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
196188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
196288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
196388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
196488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
196588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
196688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
196788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
196888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
19697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1970921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
197188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1972921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1973ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
197496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
197589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1976a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1977a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
197896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
197996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
198096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
198196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
198296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
198396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
198488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
198688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
198788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
198892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
198992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
199092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
19917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
19927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
19937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19944a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
19967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
19977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
19997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
20007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
20017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
20044a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
20067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20154a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
202292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
202392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
202492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20254a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
202692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
2027dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
202892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
203092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
203192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
203288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
20334a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
203488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
203588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
203688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
203788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
203888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
203988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
204088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
204188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
20424a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
204388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
204488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
204588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
204688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
2047be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
2048be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2049be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
2050be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
20514a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2052a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2053be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
2054be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
205580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2056be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
205788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
20584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
205988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
206088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
206188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
206288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
206388f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
206488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
206592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
206692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
206792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20684a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
207092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
207157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
207257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
207357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
207457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
20751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
207657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
207757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
207857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
207992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
208092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
208157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
208289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
20844a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
20867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
20897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
20917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
20927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20964a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21014a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
210492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
21057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
211257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
211392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
211492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
211557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
211689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
21184a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
21227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
21247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
21257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
21267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
21277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21294a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21344a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
213757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21414a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
214557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
214692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2147ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
2148ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
21494a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2150ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2151ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2152ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
215380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2154ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
2156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21604a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
2166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
21674a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
217180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
218392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
218492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
218592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2186094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
2187094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
21884a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2189094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
2190094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
2191094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
21924a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2193094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
21944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2195094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
21964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2197921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
21984502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
21994502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
22004502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
22014502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
22024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
22034a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
22044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
2205094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
2206094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
2207094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
22084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2209094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
2210094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
2211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
22124502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
22134502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
22144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
22154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
2216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
2217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
2218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
22190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
22200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
22210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22224a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
22230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
22240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
2225f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
22264a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2227f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
22284a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2229f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2230f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
2231f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2232f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
2233f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
2234f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
2235f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2236f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
22374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2238f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
2239f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
2240f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
22410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
22420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
22436a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
22446a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
22457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
22466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
224789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
2249f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
22504a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2252f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
2253f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
2254f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
2255f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22624a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
2267f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
22684a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2270f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
2271f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
22722fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
22732fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
22742fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
22816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
22826a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
22830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
228486f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
22854a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2286a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
228786f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
228886f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
22894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
22904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
22910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
22920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
22930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
22940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
22950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
22964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
22970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
22980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
22990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
230089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
23017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
23034a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
23067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
23077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
23097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
23127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
23134a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
23147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
23194a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
23237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
23247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23254a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
23267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
23290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
2330abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23318567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
23324a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23338567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
23348567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
23358567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
23368567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
23378567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
23384a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
23398567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
23408567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
23418567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
2342abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
23434a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2344abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
23454a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2346abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2347abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
2348abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2349abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
23504a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2351abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2352abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2353abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
2354abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
23554a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2356abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2357abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
2358abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
2359abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2360abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
2361abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
23624a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2363abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2364abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2365abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
23670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
23680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
236942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
237042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
237142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23724a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
237342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
237442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
23754a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2376df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2377370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
2378df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2379df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
2380df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2381df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
2382df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
238342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
23844a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
23854a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
238642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
238742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
238842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
238942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
23904a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
239142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
239242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
239342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
239442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
239542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
239642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
2397a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
23987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
23997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24004a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2401a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
24027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
24037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
24044a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2406a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
24077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
240880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
24117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
24124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
24147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
24157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
24167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
24177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
24187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
2419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
2421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24224a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
2424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24254a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
2427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
24284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
2430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24334a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
2437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
24417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
24427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
24444a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
24457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
24467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
24484a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
24517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
24527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
24537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
24557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
24624a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24644a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
24667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
24677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
24694a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
24727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
24754a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
24787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2491a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
24924a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
24964a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2497a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24984a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2499a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2500a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25024a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2503a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
25064a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
250766f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
25084a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2510a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2511a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2512a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25134a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2514a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2516a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
25174a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2518a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2519a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2522a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25234a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2524a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2525a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2526a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2527a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2528a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
25294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2530332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2531332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2532332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
253329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int i, r, j;
2534332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2535332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2536332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
253829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int tmp3 = r600_get_temp(ctx);
25394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2584332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2585332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2586332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2587332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2588332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2590332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2594332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2598332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2600332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2602332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2608332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2610332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2613332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2614332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2616332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2618332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
26294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
26324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2636332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2637332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
26534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2658332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2678332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2679332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
268129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
268229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp3.x = u2f(src2) */
268329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
268429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2685332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
268629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
268729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
268829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
268929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
269029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
269129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
269229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
269329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
269429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
269529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
269629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
269929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
270029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp0.x = recip(tmp3.x) */
270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 3; j++) {
270329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 0);
270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp3;
271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (j == 2)
271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.last = 1;
271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
272029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].value = 0x4f800000;
272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
272929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (r)
273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
273429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
273629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp3;
274329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
274629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
27484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
27524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
276329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
276429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
276529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
276629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
276729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
27684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
277029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
277129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
277229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
277329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2774332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
277529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
277629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
277729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
2778332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
277929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
278029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
278129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
278429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
278529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
278629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
278929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
279029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
27924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
279329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
279429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2795332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
280329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
280429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
280629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
280729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
280829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
281129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
281229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
28134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
28154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
28174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
28204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
28234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
28254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
283129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
283229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
283329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
283429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
283629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
283729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
283829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
284029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
284129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
28424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
284329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
284429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
284529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
284629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
284729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
285029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
285129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
285229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
28534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
285529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2856332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
285829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
285929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
286229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
286429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
286729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
286929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
287029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
287129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
287229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
287329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
287429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
2875332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
28774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2880332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
28834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
28894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
28904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
28914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
289729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
289829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
289929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
290029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2901332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
290229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
290329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
290429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 3);
29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
290629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
290729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 2;
29084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
290929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
291029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
29114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
291229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
291329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
291429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
291529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
291629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		} else {
291729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
291829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
291929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
292029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
292129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 3;
292229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
292329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
292429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
292529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 2;
292629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
292729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
292829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 0;
292929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
293029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
293129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
293229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
293329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
29344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
29364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2938332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2939332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2941332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2942332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
29474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2948332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2950332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2951332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2953332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2955332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2956332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2958332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2959332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2964332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2965332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2967332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2968332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
29704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
29724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2973332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
29754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
29764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
29774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
29804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
29814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
29824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
29834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
29844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
29864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
29884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
299029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
299129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
299229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
299329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
29944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
299529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
299629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
299729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
29984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
299929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
300029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
30014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
300229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
300329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
300429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 0;
300529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
300729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
300929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
301029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
301129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
301229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
301429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
30164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
301829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
302429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
302729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
302929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
303029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
303229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
303329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
303429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
303729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
303829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
303929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
304029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
304229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
304329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
304429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
30454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
304629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
304729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].sel = tmp2;
304829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].chan = 1;
304929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
305029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
305129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
305229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
305329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
305429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 2;
305529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
305629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
305729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
305829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
305929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
306129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
306229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
306429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
306529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
306629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
30674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
306829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
306929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
307029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
307129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
307229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
307329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
307429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
307529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
307629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 2;
307729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
307829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
307929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
308029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
308129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
30844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
30864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
30884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
30894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
30904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
30934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
30944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
30964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
30974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
31044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3108332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3109332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
3111332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
3112332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3121332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
3125332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
31274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
31364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
31374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3146332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3147332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
3149332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
3151332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3153332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3154332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
3156332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
3157332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
3160332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
31734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
31784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
32064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
32214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3225332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3227332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
3228332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
32304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3236332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
32414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
3248332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
3251332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3255332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
32714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3279332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3280332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
3286332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3289332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3290332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
32964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
33024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
33224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
33504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
33514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
33584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
33594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
33684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
33694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
3370332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
3371332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
3372332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
33744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
33764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
33794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
33814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
33844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
33864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
33894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
33914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3393a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3394a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
3395a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{
3396a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3397a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct r600_bytecode_alu alu;
3398a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int i, r;
3399a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3400a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
3401a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3402a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3403a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3404a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3405a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3406a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3407a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
3408a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3409a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.sel = ctx->temp_reg;
3410a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.chan = i;
3411a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.write = 1;
3412a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3413a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3414a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (i == last_inst)
3415a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3416a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3417a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3418a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3419a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3420a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3421a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3422a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3423a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3424a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3425a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3426a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = ctx->inst_info->r600_opcode;
3427a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3428a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3429a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3430a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].sel = ctx->temp_reg;
3431a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].chan = i;
3432a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3433cd97a5f660399212a23b6dcd02906231f2dc5525Dave Airlie		if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT)
3434a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3435a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3436a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3437a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3438a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3439a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3440a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	return 0;
3441a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin}
3442a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
34436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
34446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
34456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
34466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
34476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
34486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
34496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
34506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
34526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
34586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
34606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
34616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
34656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
34746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
34806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
34816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
34846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
34866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
34886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
34896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
34976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
34986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
349942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
350042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
350142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
350242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
350342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
350442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
350542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
350642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
350742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
350842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
350942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
351042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
351142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
351242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
351342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
351442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
351542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
351642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
351742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
351842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
351942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
352042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
352142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
352242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
352342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
352442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
352542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
352642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
352742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
352842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
352942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
353042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
353242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
353342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
353442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
353542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
353742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
353842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
353942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
354042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
354242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
354442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
354542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
354742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
354942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
355042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
355242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
355342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
355442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
355542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
355642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
355742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
355842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
355942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
35606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35620d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
35630d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
35640d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3566921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
35670d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35680d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
35690d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35704a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3571a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35720d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
3573cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
35740d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
3575cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
35760d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3578921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
35794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
35800d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35810d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
35820d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
35834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
35840d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
35850d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
35860d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
35870d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35880d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
35890d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35904a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3591a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35920d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
359380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
35940d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35950d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3596cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
35970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
35980d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3599921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
36000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
36010d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36020d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
3603cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
36040d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36050d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
36060d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
36074a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
36080d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
36090d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
36100d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
36110d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
36120d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
36130d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3614cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
36164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
3618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3619cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
36204a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3622a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
36236c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
3624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
3625a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
362680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3627cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
3628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
3629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
3631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
3632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
36334a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3634cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
3635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
3636cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
3637cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
3638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
3641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
3642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36434a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
3645dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
36477be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
36487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
36497be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
36507be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
36514a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36544a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36567be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
365780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
3659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
3660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
36617be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
36687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3669cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3671cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
3672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
3673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
3676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
36784a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3679cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3680cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36814a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3683a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
368480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
3686a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
3688cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
3689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
3690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
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;
3695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3697921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3701e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3702e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3703e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3704e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3705e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3706e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3707e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
37144a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
37187be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
37216415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
37226415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
37236415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37246415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37256415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3726192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3727192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
37286415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
37296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
37316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
37326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
37336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37346415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37356415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
37366415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
373833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
373933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
374096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
374133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37424a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
37434a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3744641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
374540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3746bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3747da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3748da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
37496d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	const boolean src_requires_loading = inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ &&
37506d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák                                             tgsi_tex_src_requires_loading(ctx, 0);
375178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
37526d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	unsigned sampler_src_reg = inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ ? 0 : 1;
375378293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3754641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3756641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37571d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
37581d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
37591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
37601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
37611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
37621d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
37631d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
37641d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
37651d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
37661d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
376713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
376813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
376913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
377040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
377140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
37724a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
377340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
377440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
377540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
377640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
377740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
377840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
377940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
378040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
378140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
378240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
378340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
378440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
378540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
37864a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
378740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
37884a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
378940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
379040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
379140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
379240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
379340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
37944a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
379540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
379640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
379740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
379813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
379940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
380040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
380140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
380240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
380340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
380440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
380540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
380640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
380740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
380840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
380940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
381040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
381140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
381240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
381340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
381440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
38154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
381640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
381740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
381813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
381913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
38207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3821b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
382289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
38247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38254a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38274a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
38347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38354a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
38424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38444a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38504a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
38549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
38564a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3857a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3858b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
38604a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3861b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3862b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3863b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
38644a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
38684a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3869a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3870921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3875b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
38764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
387978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3880b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3881bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38839783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
38849783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
38856d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ &&
38866d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ) {
3887261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
38880e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
38890e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
38934a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
38954a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
38964a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
39024a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
390889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39104a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
39137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
39147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
39214a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39264a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
39297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
39307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
39354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
39397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
39427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
39444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3945a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3946bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3955a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39654a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3966a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3976a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3982bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
39834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
39869783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
39879783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
39889783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39899783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
39909783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
39919783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
39929783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
39939783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
39949783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
39959783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
39969783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
39979783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
39989783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
399978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
4000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
4001bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
4002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
400378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
4004b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
40054a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4006a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
40074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4008b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
4009b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
4010b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
4011b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
4012b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
40134a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4014b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
4015b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
4016b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
401778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
4018b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
4019b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
40207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4021bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
4022929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4023929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
40246b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
40259783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
4026929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
4027929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
4028de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
4029de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
4030de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
4031de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4032de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
4033de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
4034de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4035c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
4036c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
4037c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
4038de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
4039de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
4040de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4041de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
4042de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
404333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
40444a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
4045bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
40466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
40476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
4048077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
4049641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
40506c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
40519d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
40529d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
40539d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
40549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
40556d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák
40566d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ) {
40576d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_x = 4;
40586d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_y = 4;
40596d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_z = 4;
40606d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_w = 4;
40616d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	} else if (src_loaded) {
406278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
406378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
406478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
406578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
406678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
406778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
406878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
406978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
407078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
4071244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
407278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
40739a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
4074bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
4075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
4076bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
4077bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
4078bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
4079bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
40809783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
40819783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
40829783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
40839783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
40849783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_w = 2; /* route Z compare value into W */
40859783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
4086bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40876b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
40886b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
408901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
409001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
409101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
40926b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
40936b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
4094bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40951d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
40961d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
40971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
409869d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
4099929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
4100929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
4101929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
4102929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4103929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
41046b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
4105929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
4106929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
4107929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
410878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
4109929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
4110929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
4111929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
4112929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
4113929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
4114929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
4115929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
4116929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
4117929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
4118929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
4119929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
4120929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
4121929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
4122929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
4123929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
4124929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
4125929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
4126bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
41274a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
4128bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
4129bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
4130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
4131bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
4132bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
413333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
413433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
4135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
4136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
4137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4139dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
4141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
4142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4143c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
41441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
4145c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
4146c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4147c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
4148c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
41494a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4150c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
41514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
41524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4153c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
415480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4155c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
4156c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
4157c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
4158c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
41594a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4160c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
4161c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
4162c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
4163c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
4164c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
4165c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
4166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
4167dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4168dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4169dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4170dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41714a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4172a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4173921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
4174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
41754a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
41764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
4177b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4178b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4179dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4180b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4182b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
41834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4185b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4186b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4187b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
4189dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4190dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4191dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4192dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4194a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4195b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
4196b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
41974a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4198b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4199b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4200dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4201b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4202b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4203b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
42044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4205b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4206b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4207b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4208b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4209b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
4210dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4211dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4212dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4213dffad730df17983cfaef0808555a8c26cad0aa15Christian König
42144a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4215a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4216b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
42174a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42184a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4219b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
4220b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
4221dffad730df17983cfaef0808555a8c26cad0aa15Christian König
422280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4223b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4224dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4225b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4226b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
42274a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4228b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4229b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4230b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4231dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
4232b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
4233b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
423487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
423587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
423687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42374a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
423887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
4239dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
424087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42417be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
42427be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
42437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
424487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42454a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4246a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
42474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42484a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
42494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
425080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
425187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
425287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
425387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
42547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
425587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
42564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
425787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
425887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
42597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
426087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
426187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
426287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
42640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
42650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42660e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
42670e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
42684a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
42690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
42700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
42710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
42730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
42740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
42764a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4277a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
42780e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
42794a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
42804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
42810e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
42820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
42830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
42840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
42850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
42860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
42870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
42890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
42900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
42910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
42930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
42944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
42950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
42960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
42970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
42980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
43004a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4301a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
43020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43030e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
43044a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
43054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
43060e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
43070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
43080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
43090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
43100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
43110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
43120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
43140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
43150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
43160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
43180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
431980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
432080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
43210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
43220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
43230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
43240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
43250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
43264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
43270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
43280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
43290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
43300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
43310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
43320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
43330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
43340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
433536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
433636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
433736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
43384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
433909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
43407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
434136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
434236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
434336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
43444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
434536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4346a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
43474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
434836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
434936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
435036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
435136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
435236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
43534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
435436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
435536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
435636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
435789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
43617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
436236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
43657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
43667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
43677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
43687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
43694a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
43737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
43747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
43767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
43777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
43797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
43807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
43817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
43824a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
43837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
43847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
43857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
438636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
43877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
438836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
438936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
43904a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
439136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4392a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
43934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
439436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
439536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
4396b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
4397b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4398b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
4399b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
4400b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
440136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
440236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
440336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
440436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
440536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
440736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
440836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
440936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
441036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
441136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
441236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
441389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44154a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44174a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
441836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
44227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
442536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44264a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
44307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44314a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44334a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
443436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
44387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44414a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
444536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
444636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
444736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
444836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
44494a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
445036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4451a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
445236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
445336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
445436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
445536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
445636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
445736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
445836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
44594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
446036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
446136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
446236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
446336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
446436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
446587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
4466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
4467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
4468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
44694a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
44717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
4472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4473f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
4474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
447589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44774a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44804a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44814a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
44827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
44867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
44887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44894a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
4493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44954a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44984a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
45037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4510460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
4512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4514460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
4516460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4517460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4518460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45194a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4520460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4521460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4522460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4523460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4524f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4525460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4526460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
452789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45294a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
453096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45324a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45334a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
453496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
45417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45424a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45474a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45504a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
45557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
456296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45634a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
456496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
456596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
456696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
456796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
456896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
456996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
457096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
457196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
457296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
457396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45744a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
457596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
457696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
457796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
457889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45804a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
45827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
45837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
45847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
459196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45924a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45974a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
45997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
46007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
460196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
46047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
460696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
461196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
461289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46144a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
46177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
46187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
46227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
46257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46264a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46314a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
46347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
463596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
46387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
464096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46414a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
464596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
464796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
464896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
464996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46514a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
465296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
465396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
465496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
4655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
4658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4662460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4663460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4664460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4665460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4666f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
4667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
466889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46704a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4671460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46734a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46744a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
4675460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
4682460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46834a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46884a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46924a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
46937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
46977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
46987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
47007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
47017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
47027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4703460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4704460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4705460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4706460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
47074a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4708460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4709460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4710460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4711460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4712460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4713460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4714460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4715460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4716460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4717460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
47184a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4719460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4720460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4721460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4722460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4723460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4724460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4725460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
472698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
472798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
472898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47294a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
473098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4731a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47324a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
473398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
473452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
473552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
473652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
473752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
473852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
473952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
474052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
47419b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
47428e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
47439b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
474452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
474552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
474652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
474752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
474852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
47498e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
475098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
47518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
47528e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
47534a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
475498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
475598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
47568e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
47578e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
475898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
475998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
476098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
476147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
476247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47634a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
476447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4765a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
47677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4768077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4769077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
47704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47718e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4772077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4773077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4774077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47754a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4776077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4777077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4778077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4779077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
47808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
47818e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4782077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4783077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4784077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47854a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4786077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
47877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
47887ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4789077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4790077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
47914a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47928e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4793077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4794077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4795077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47964a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4797077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
47987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
47999b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
48008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
48018e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
48028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
48038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
48048e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
48058e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
48068e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
48078e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
48088e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
48099b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
48107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
48117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
48127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
48137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
48147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48158e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
481647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
481747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
481847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
481957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
482057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
482157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
48224a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
482357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
482457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
482557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
48264a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
482757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4828a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
482980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
48307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
483257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
483357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48344a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
483557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
483657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4837a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
483857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
483957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48404a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
484157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
484257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
484357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
48444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
484557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
484657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
484757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
484857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
484957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
485057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4851a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4852a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48534a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4854a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4855a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48564a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4857a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4858da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.execute_mask = 1;
4859da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.update_pred = 1;
4860a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4861a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4862a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4863a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4864a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48654a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4866a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4867a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
48687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4869a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4870a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48714a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4872a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4874a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4875a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4876a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4877a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48792bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
48802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
48812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
48822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
48832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
48844f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
48852bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
48864f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
48872bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
48882bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
48892bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
48902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
48914f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
48922bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
48932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
48944f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
48952bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
48962bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
48972bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
48982bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
48992bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
49002bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
49012bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
49024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
49038813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
49048813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
49058813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
49062bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4907a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4908a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4909a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
491009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4911a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
491209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
491309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
491409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
491509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
491609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
491709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
491809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
491909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
492009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
492109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
492209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
492309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
492409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
492509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4926a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
492709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
492809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
492909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
493009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
493109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
493209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
493309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
493409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
493509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
493709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4938a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4939a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4940a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
494409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
49487ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
495109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
495209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
495309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
495609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
495909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
496409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
496509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
496609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49734a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
49744a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4978a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
498009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4981a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
499109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
499309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
499609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
499809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
500009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
500109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50024f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
500309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
500409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
500509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
500709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
500809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50094f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
501009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
5011370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX work out offset */
501209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
501309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
5014a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
501509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
501609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
501709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
501809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
501909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
502009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
502109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
502309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
502409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
502509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
502809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
503309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
503509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
503609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
503709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50384a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
504009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
504209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
504409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
504509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
504609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
504809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50498b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
505009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50514a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
505209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
505309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
505409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
505509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
5056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5058a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5059a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
5060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
50614a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
5062a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
5063a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
506409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
5065a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
5066a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5067a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5068a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5069a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
5070a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
5071a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
5072a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
5073a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
5074a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
5075a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
5076a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5077a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
5078a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5079a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
5080a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
508109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
5082a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
508309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
508409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
508509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
508609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
508709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
508809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
508909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
509009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50914a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
509209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
509309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
5094a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
509509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
509609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
509709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
509809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
509909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
510009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
510109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
510209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
510309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
51044a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
510509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
510609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
510709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
510809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
510909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
511009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
511209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
511309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
511409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
511509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
511609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
511709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
511909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
512009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
512109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
512209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
5123370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX add LOOPRET support */
512409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
512509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
512609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
512709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
512809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
512909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
513009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
513109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
513209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
513309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
513409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
513509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
513609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
513709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
513809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
513909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
514009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
514109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
514209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
514309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
51444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
514509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
514609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
514709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
514809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5151a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5152cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
5153cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
5154cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5155cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
5156cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
5157cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
5158cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5159cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
5160cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5161cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5162cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5163cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5164cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5165cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5166cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
5167cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
5168cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
5169cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5170c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
5171cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
5172cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5173cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5174cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
51759b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
5176cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5177cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5178cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5179cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5180cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5181cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5182cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5183cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5184cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5185cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5186cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5187cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5188cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5189c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5190cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5191cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
5192cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
5193cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5194cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5195cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
5196cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
5197cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5198cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5199cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5200cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5201cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5202cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
5203cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
5204cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
520698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
52080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5209df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
5210370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
5211df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
5212df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
5213df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
5214df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
5215df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
521642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
521736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5218460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5221cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5222cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
522357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5224dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5226d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5227be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5230b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52403af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5241df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
52427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
52434558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5244a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
52450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52487a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5250e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
525188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
52523af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
52533af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
52544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52600d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52620d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
526388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5264d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
52650d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5267b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
526813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5269b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52769f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52800d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
528187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
528292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5283c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5286cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5287ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
528809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5289a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5293a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5294a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53008c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5301c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5302cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
53030ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5304d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
5305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5307c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5308c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
53094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5310cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53121d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
53131d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
531409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
531709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
531909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53216d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5336094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5340bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
5341332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5342c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5343c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
53445893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5345c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5346d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
53470196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5348c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
53499a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5350c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
53514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5352c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5353c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5354c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
53554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5356850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5357c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5358c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5359d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
53607383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5361c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
5362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5366cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5367a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,  0, 0, tgsi_unsupported},
5368a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
5369cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5370cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5371cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5372cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5373cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5374cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5375a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5376cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5377cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
53789b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
53799b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
53806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
538142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
538450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
538550526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
538698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
538750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
538850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
538950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
53908ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
539150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5392112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
539350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
539450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
539550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
539650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
539750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
539850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
539950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
540050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
540150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
540250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
540350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
540450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
540550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
540650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
540750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
540850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
540950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
541050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
541350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5415df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
541650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
541750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
541850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
541950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
542050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
542150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
542350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
542550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
542650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
542750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
542850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
542950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
543550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
543750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
543850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
543950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
544050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
544213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
544350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
544450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
54517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
54557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
54567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5457c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
54587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
54627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
54637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
54647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
54687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
54697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54748c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5475608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5476cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
54777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5478d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5481cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5482cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
54834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5484cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
54857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54861d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
54871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
54887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
54897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
54927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
54947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54956d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
54967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
55117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
55127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5514a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
5515332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5516cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5517cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5518cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5519cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5520d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5521cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5522a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
5523b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5524cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
55254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5526cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5527cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5528cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
55294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
55309b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5531cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5532cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5533d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
55347383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5535cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
55367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5540cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5541a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5542a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5543cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5544cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5545cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5546cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5547cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5548cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5549a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5550cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5551cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
55529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
55539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
55546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
555542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
55567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
55587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
55597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
55607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
55617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
55637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
55647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
55657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
55667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
55677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
55687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
55727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
55737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
55747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
55757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
55767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
55777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
55797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
55877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5589df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
55907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
55917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
55927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
55937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
55947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
56007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
56017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
56027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
56037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
56097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
56117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
56127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
56137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
56147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
561613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
56177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
56187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
562550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
562950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
563050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5631c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
563250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5635ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
563650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
563750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
563850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
563950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
564250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
564350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
564450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56488c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5649f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5650cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
56510ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5652f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5655f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5656f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
565729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5658cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
565950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
56611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
566250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
566350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
566650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
566850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56696d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
567050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
567150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
567650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
568550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
568650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
568750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5688f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
568929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5690cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5691cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5692f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5693f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5694f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5695f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5696f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5697f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5698f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
569929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5700f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5701f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5702f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
570329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5704d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5705f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5706f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5707f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5708f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5709f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
571050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
571150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
571250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
571350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5714cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5715a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5716a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5717cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5718cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5719cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5720cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5721cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5722cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5723a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5724cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5725cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5726f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
57279b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5728f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5729f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
573050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
573150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5732