r600_shader.c revision b8e9cf5d965ce09227cd9875c4381c73f237f196
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;
2968f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	unsigned push_modifier;
297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for(src_idx = 0; src_idx < 3; src_idx++) {
300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		bytes_read = r600_src_from_byte_stream(bytes, bytes_read,
301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								&alu, src_idx);
302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.sel = bytes[bytes_read++];
305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.chan = bytes[bytes_read++];
306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.clamp = bytes[bytes_read++];
307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.write = bytes[bytes_read++];
308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.rel = bytes[bytes_read++];
309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst0 = bytes[bytes_read++];
310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst1 = bytes[bytes_read++];
311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.inst = inst0 | (inst1 << 8);
312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.last = bytes[bytes_read++];
313ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.is_op3 = bytes[bytes_read++];
3148f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	push_modifier = bytes[bytes_read++];
315da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.pred_sel = bytes[bytes_read++];
316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle = bytes[bytes_read++];
317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle_force = bytes[bytes_read++];
318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.omod = bytes[bytes_read++];
319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.index_mode = bytes[bytes_read++];
3208f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
3218f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
3228f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE) ||
3238f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE) ||
3248f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT) ||
3258f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)) {
3268f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.update_pred = 1;
3278f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.dst.write = 0;
3288f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.src[1].sel = V_SQ_ALU_SRC_0;
3298f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.src[1].chan = 0;
3308f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.last = 1;
3318f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune    }
3328f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
3338f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune    if (push_modifier) {
3348f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune        alu.pred_sel = 0;
3358f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.execute_mask = 1;
3368f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
3378f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	} else
3388f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		r600_bytecode_add_alu(ctx->bc, &alu);
3398f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* XXX: Handle other KILL instructions */
342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) {
343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->shader->uses_kill = 1;
344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		/* XXX: This should be enforced in the LLVM backend. */
345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->bc->force_add_cf = 1;
346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu,
351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned pred_inst)
352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	fc_pushlevel(ctx, FC_IF);
355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			struct r600_bytecode_alu *alu, unsigned compare_opcode)
360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned opcode = TGSI_OPCODE_BRK;
362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (ctx->bc->chip_class == CAYMAN)
363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else if (ctx->bc->chip_class >= EVERGREEN)
365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else
367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	llvm_if(ctx, alu, compare_opcode);
369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_loop_brk_cont(ctx);
370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_endif(ctx);
371ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
376ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
377ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst;
378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
379ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0);
380ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst = bytes[bytes_read++];
381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	switch (inst) {
3822fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 0: /* FC_IF */
383ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		llvm_if(ctx, &alu,
384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3862fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 1: /* FC_IF_INT */
387bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		llvm_if(ctx, &alu,
388bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
389ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3902fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 2: /* FC_ELSE */
391bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_else(ctx);
392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3932fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 3: /* FC_ENDIF */
394bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endif(ctx);
395ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3962fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 4: /* FC_BGNLOOP */
397bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_bgnloop(ctx);
398ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3992fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 5: /* FC_ENDLOOP */
400bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endloop(ctx);
401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
4022fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 6: /* FC_BREAK */
403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
404bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
4062fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 7: /* FC_BREAK_NZ_INT */
407bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		r600_break_from_byte_stream(ctx, &alu,
4082fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
409bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		break;
4102fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 8: /* FC_CONTINUE */
411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		{
412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			unsigned opcode = TGSI_OPCODE_CONT;
413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (ctx->bc->chip_class == CAYMAN) {
414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&cm_shader_tgsi_instruction[opcode];
416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else if (ctx->bc->chip_class >= EVERGREEN) {
417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&eg_shader_tgsi_instruction[opcode];
419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else {
420ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
421ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&r600_shader_tgsi_instruction[opcode];
422ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			tgsi_loop_brk_cont(ctx);
424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
4262fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 9: /* FC_BREAK_Z_INT */
42718617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		r600_break_from_byte_stream(ctx, &alu,
42818617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
42918617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		break;
4302fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 10: /* FC_BREAK_NZ */
4312fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard		r600_break_from_byte_stream(ctx, &alu,
4322fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
4332fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard		break;
434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
442ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_tex tex;
443ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
444ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.inst = bytes[bytes_read++];
445ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.resource_id = bytes[bytes_read++];
446ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_gpr = bytes[bytes_read++];
447ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_rel = bytes[bytes_read++];
448ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_gpr = bytes[bytes_read++];
449ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_rel = bytes[bytes_read++];
450ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_x = bytes[bytes_read++];
451ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_y = bytes[bytes_read++];
452ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_z = bytes[bytes_read++];
453ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_w = bytes[bytes_read++];
454ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.lod_bias = bytes[bytes_read++];
455ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_x = bytes[bytes_read++];
456ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_y = bytes[bytes_read++];
457ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_z = bytes[bytes_read++];
458ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_w = bytes[bytes_read++];
459ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_x = bytes[bytes_read++];
460ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_y = bytes[bytes_read++];
461ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_z = bytes[bytes_read++];
462ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.sampler_id = bytes[bytes_read++];
463ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_x = bytes[bytes_read++];
464ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_y = bytes[bytes_read++];
465ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_z = bytes[bytes_read++];
466ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_w = bytes[bytes_read++];
467ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
468ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_tex(ctx->bc, &tex);
469ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
470ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
471ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
472ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
473e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
474e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	unsigned char * bytes, unsigned bytes_read)
475e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{
476e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	struct r600_bytecode_vtx vtx;
4772c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4782c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read);
4792c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard        uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read);
4802c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read);
4812c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
482e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	memset(&vtx, 0, sizeof(vtx));
4832c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4842c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD0 */
4852c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0);
4862c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0);
4872c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0);
4882c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0);
4892c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0);
4902c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0);
4912c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4922c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD1 */
4932c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1);
4942c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1);
4952c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1);
4962c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1);
4972c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1);
4982c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1);
4992c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1);
5002c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1);
5012c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1);
5022c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1);
5032c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
5042c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD 2*/
5052c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2);
5062c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2);
507e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
508e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
509e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		fprintf(stderr, "Error adding vtx\n");
510e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	}
511e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	/* Use the Texture Cache */
512e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
513e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	return bytes_read;
514e42df8e10a83e76565474f82330d34403da71b49Tom Stellard}
515e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes,	unsigned num_bytes)
518ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
519ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned bytes_read = 0;
5206f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard	unsigned i, byte;
521ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	while (bytes_read < num_bytes) {
522ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		char inst_type = bytes[bytes_read++];
523ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		switch (inst_type) {
524ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 0:
525ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_alu_from_byte_stream(ctx, bytes,
526ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
527ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
528ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 1:
529ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_tex_from_byte_stream(ctx, bytes,
530ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
531ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
532ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 2:
533ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_fc_from_byte_stream(ctx, bytes,
534ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
535ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
5366f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard		case 3:
5376f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
5386f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			for (i = 0; i < 2; i++) {
5396f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				for (byte = 0 ; byte < 4; byte++) {
5406f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					ctx->bc->cf_last->isa[i] |=
5416f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					(bytes[bytes_read++] << (byte * 8));
5426f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				}
5436f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			}
5446f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			break;
545e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
546e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		case 4:
547e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
548e42df8e10a83e76565474f82330d34403da71b49Tom Stellard								bytes_read);
549e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			break;
550ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		default:
551ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			/* XXX: Error here */
552ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
553ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
554ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
555ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
556ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
557ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
56772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
571c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
572a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
57672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
577a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
5798260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
5808260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
5818260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
58647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
58747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
59272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
59372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
59550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
59650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
5974a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
601fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
605fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
606fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
607fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
608fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
609fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
610fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
611fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
612fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
613fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
614fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
615fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
616fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
6177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
618fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
619fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
620fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
62150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
62250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
6234a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
62450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
62550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
626738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
62750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
628738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
62950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
63050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
631fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
63250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
63350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
63450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
63550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
636fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
637fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
638fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
639fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
640fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
64150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
64250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
64350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
64450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
6454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
64650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
64750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
64850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
64950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
6507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
6517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
65221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
65321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
65421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
65521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
65621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
65821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
65921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
660738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
66121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
66221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
66321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
66421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
66521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
66621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
66721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
66821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
66921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
67021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
67121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
67221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
67321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
67421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
67521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
67621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
67721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
6787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
6790a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
6800a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
6810a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6820a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
6830a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
6840a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
6850a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
6860a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6870a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
6880a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
6890a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
6900a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
6910a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
6920a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
6930a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
6940a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
6950a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
6960a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6970a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6980a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
6990a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
7000a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
7010a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
7020a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
7030a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
7040a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
7050a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
7060a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
7070a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
7080a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
7090a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
7100a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
7115b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7125b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7135b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
7145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
7155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
7165b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
7175b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7185b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
7195b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
7205b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
7215b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
7225b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
7235b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
7245b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
7255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
7265b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
7275b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
7285b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
7295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
7305b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
7315b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
7325b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
7335b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7345b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
7355b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
7365b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
7375b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
7385b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
7395b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7405b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
7415b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
7425b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
743725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
744725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
745725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
746725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
747725a820b926575265e6790601a0defd9c30947dcVadim Girlin
748725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
749725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
750725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
751725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
752725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
753725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
754725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
755725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
756725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
757725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
758725a820b926575265e6790601a0defd9c30947dcVadim Girlin
759725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
760725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
761725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
762725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
763725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
764725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
765725a820b926575265e6790601a0defd9c30947dcVadim Girlin
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
767725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
768725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
770725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
771725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
772725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
773725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
774725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
775725a820b926575265e6790601a0defd9c30947dcVadim Girlin
776725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
777725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
778725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
779725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
780725a820b926575265e6790601a0defd9c30947dcVadim Girlin
781725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
782725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
783725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
784725a820b926575265e6790601a0defd9c30947dcVadim Girlin
785725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
786725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
787725a820b926575265e6790601a0defd9c30947dcVadim Girlin
788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
78972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
79296bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
79372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
7995b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
8001279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].interpolate = d->Interp.Interpolate;
8011279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].centroid = d->Interp.Centroid;
802024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
803725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
804c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			switch (ctx->shader->input[i].name) {
805c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_FACE:
806725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
807c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
808c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_COLOR:
809725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
810c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
811c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_POSITION:
812c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				ctx->fragcoord_input = i;
813c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
814c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			}
815725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
816c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				if ((r = evergreen_interp_input(ctx, i)))
817725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
818fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
81950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
8255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
826024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
8271279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->output[i].interpolate = d->Interp.Interpolate;
82891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
82991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
83091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
83191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
83291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
83391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
83491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
83591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
836e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák				ctx->shader->vs_out_point_size = 1;
83791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
83854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
83954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
84054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
84154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
84291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
8430c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		} else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
8440c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			switch (d->Semantic.Name) {
8450c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			case TGSI_SEMANTIC_COLOR:
8460c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				ctx->shader->nr_ps_max_color_exports++;
8470c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				break;
8480c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			}
84991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
85333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
85447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
85696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
857c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
858c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
859951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			if (!ctx->native_integers) {
860951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				struct r600_bytecode_alu alu;
861951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
86296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
863951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
864951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].sel = 0;
865951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].chan = 3;
86696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
867951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.sel = 0;
868951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.chan = 3;
869951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.write = 1;
870951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.last = 1;
87196bbc627f369c0100b950f81531b1fe9ef586c34Christian König
872951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
873951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin					return r;
874951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			}
875c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
87639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
87739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
88372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
88472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
885be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
886be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
887be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
888be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
889be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
8907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
891fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
892fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
893fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
894fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
895fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
896fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
897fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
898fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
899fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
900fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
901fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
902fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
903fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
904fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
905fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
906fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
907fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
908fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
909fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
910fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
911fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
912fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
913fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
914fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
915fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
916fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
917fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
918fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
919fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
920fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
921fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
922fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
923fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
924fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
925fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
926fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
927fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
928fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
929fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
930fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
931fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
932fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
933370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
934fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
935fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
936fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
9371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
9401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
9411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
9421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
9431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
9441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
9451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
9461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
9471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
94896bbc627f369c0100b950f81531b1fe9ef586c34Christian König
9491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
9501fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
9511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
9521fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
9531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
9541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
9564a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
9571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
9581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
9591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
9601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
9611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
9621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
96396bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
96439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
96539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
96639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
96739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
96839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
96939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
97039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
97139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
97239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
97339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
97439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
97539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
97639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
977c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
9781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
9791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
9801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
9811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
9821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
9831fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
9841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
9874a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
989077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
990077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
9924a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
993077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
994077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
995077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
9978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
998077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
1000077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
1001077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10064a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
10118e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
1013077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
1015077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
1016077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
1017077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
1018077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
1019077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
1020077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
1021077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
1022077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
1023077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
1024077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
1025077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
1026077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
1027d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
1028077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10294a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
1030077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
1031077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1032077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
1033077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
1034077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
10367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
10407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
10427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
10437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
10447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
10467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
1048077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
1049077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
1050077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
1051077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1052077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
1053077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
1054077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
1055077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
1056077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1057077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
1058077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
1059077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
1060077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10634a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10734a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
10787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
10797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
10807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
10837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
10847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
10867687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
10877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10894a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
10917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
10937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
10957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
10987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
11007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
11014a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
11027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
11037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
11047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
11057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
11067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
11077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
11087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
11097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
11107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
11114a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
11127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
11137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
11147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
11157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
11167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
11177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
11187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
11197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
11207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
11217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
1122725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1123725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
1124725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
1125725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1126725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
1127725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
1128725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
1129725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
1130725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1131725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1132725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1133725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
1134725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
1135725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1136725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
1137725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
1138725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
1139725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1140725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1141725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
1142725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1143725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
1144725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1145725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1146725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1147725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
1148725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1149725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
1150725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
1151725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
1152725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
1153725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1154725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1155725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
1156725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
1157725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
1158725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1159725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1160725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
1161725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
1162725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1163e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
116472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1165eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
11664acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct tgsi_token *tokens = pipeshader->selector->tokens;
11674acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct pipe_stream_output_info so = pipeshader->selector->so;
1168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
11695555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
11714a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
1172457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
117454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
117554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
1176ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Declarations used by llvm code */
1177ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bool use_llvm = false;
11787f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned char * inst_bytes = NULL;
11797f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned inst_byte_count = 0;
118072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1181ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1182ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	use_llvm = debug_get_bool_option("R600_LLVM", TRUE);
1183ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
1185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
118615ca9d159e50815b0bfe60df8873f48c32a59ca5Marek Olšák	ctx.native_integers = true;
1187951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin
1188c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
1192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
1194f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1196725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
1197c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	ctx.fragcoord_input = -1;
1198725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
119954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
1200725a820b926575265e6790601a0defd9c30947dcVadim Girlin
12010c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_color_exports = 0;
12020c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_max_color_exports = 0;
12030c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1204725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1205feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
1206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
1207076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
1208076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
1209076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
1210f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
1211f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
1212f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
1214076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
1215076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
1216076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
1217076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
123289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
12334a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1234f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
12354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1236f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
123889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1239fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
124084457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
1241ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1242ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* LLVM backend setup */
1243ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1244ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm && ctx.info.indirect_files) {
1245ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		fprintf(stderr, "Warning: R600 LLVM backend does not support "
1246ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"indirect adressing.  Falling back to TGSI "
1247ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"backend.\n");
1248ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		use_llvm = 0;
1249ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1250ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1251ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		struct radeon_llvm_context radeon_llvm_ctx;
1252ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		LLVMModuleRef mod;
1253ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned dump = 0;
1254ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx));
1255ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1256ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens);
1257ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
1258ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			dump = 1;
1259ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1260ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count,
1261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard							rctx->family, dump)) {
1262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			FREE(inst_bytes);
1263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			radeon_llvm_dispose(&radeon_llvm_ctx);
1264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			use_llvm = 0;
1265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			fprintf(stderr, "R600 LLVM backend failed to compile "
1266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"shader.  Falling back to TGSI\n");
1267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		} else {
1268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_OUTPUT] =
1269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					ctx.file_offset[TGSI_FILE_INPUT];
1270ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1271ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_dispose(&radeon_llvm_ctx);
1272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* End of LLVM backend setup */
1275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (!use_llvm) {
1277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx.file_offset[TGSI_FILE_OUTPUT] =
1278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_INPUT] +
1279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
12824d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1283d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
128497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
128597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
128697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1287d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
12887728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
12898e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
12904d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
12918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
1292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1293cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
1294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
12955555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
1301cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1302cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
1303cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
1304cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
1305cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
1306cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1307cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1308cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1309cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1310cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
1318725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1319725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
1320725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
132191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
132291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1323725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
1324725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
132591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
132691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
132791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
132891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
132991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
1330725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1331725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1332725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
1333725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1334725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
1335725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
1336725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1337725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1338725a820b926575265e6790601a0defd9c30947dcVadim Girlin
13390c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (shader->fs_write_all && rctx->chip_class >= EVERGREEN)
13400c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		shader->nr_ps_max_color_exports = 8;
13410c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1342c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	if (ctx.fragcoord_input >= 0) {
1343cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		if (ctx.bc->chip_class == CAYMAN) {
1344cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			for (j = 0 ; j < 4; j++) {
1345cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				struct r600_bytecode_alu alu;
1346cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1347cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1348cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1349cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].chan = 3;
1350cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie
1351cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1352cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.chan = j;
1353cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.write = (j == 3);
1354cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.last = 1;
1355cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1356cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie					return r;
1357cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			}
1358cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		} else {
1359cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			struct r600_bytecode_alu alu;
1360cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1361cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1362cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1363cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].chan = 3;
1364c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1365cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1366cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.chan = 3;
1367cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.write = 1;
1368cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.last = 1;
1369cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1370cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				return r;
1371cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		}
1372c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	}
1373c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1374725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
1375725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
1376725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
1377725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1378725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1379725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
1380725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1381725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
1382725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
1383725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
1384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (use_llvm) {
1385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				continue;
1386ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
1387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
1388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1390be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
1391be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
1392be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
13931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
13947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
13957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
13967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
13977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
13987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
139989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
140189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
140250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
140350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
140450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
1406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1410725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1413eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Get instructions if we are using the LLVM backend. */
1415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		FREE(inst_bytes);
1418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1420457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
1421eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
142254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
142354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
142454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
142554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
142654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
142754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
142854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
142954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
143054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
143154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
143254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
143354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
14345a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		/* reset spi_sid for clipvertex output to avoid confusing spi */
14355a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		shader->output[ctx.cv_output].spi_sid = 0;
14365a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin
143754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
143854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
143954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
144054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
144154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
144254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
144354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
144454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
144554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
144654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
144754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
144854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
144954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
145054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
145154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
145254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
145354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
145454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
145554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
145654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
145754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
145854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
145954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
146054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
146154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
146254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
146354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
146454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
146554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1466543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1467543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1468543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1469543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1470543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1474543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1475543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1476543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
14778ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			if (so.output[i].dst_offset < so.output[i].start_component) {
14788ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
14792449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
14802449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1481543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1482543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1483543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1484543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1485543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
14868ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1487543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1488543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1489543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1490c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1491c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1492c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
14938ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1494543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1495543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1496543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1497543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1498543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1499543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1500543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1501543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1502543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1503543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1504543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1505543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1506543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1507543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1508543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1509543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1510543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1511543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1512543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1513543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1514543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1515543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1516543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1517543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1518543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1519543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1520543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1521543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1522543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1523543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1524543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1525543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1526543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1527543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1528543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1529543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1530543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1531eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
153254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
153354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
153454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
153554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
153654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
153954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
154054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
154154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1544457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
154691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
154791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
154854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
154954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
155091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
155191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
155291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
155554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
155654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
155891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
155991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
156054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
156154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
156254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
156354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
156454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
156554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
156654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
156754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
156854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
156954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
157054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
157191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
157213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
157313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
157413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
157513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
157613daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
15810c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				/* never export more colors than the number of CBs */
15820c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) {
15830c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					/* skip export */
15840c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					j--;
15850c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					continue;
15860c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				}
158726cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák				output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
158954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
15900c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				shader->nr_ps_color_exports++;
15914f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
15920c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					for (k = 1; k < rctx->nr_cbufs; k++) {
159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
159454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
159554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
159654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
159754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
159854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
160026cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák						output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
160254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
160354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
160454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
160554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
16060c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin						shader->nr_ps_color_exports++;
1607feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1608feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
16095f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
161054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
161154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
161254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
161354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
161454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
161539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
161654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
161754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
161854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
161954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
162054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
163172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
163254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
163354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
163454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
163554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
163654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1637457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
163854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1639457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
164054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
164154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
164254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
164354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
164454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
164554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
164654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
164754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
164854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
164954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
165054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
165154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
165254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
165354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1654c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
165554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1656481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
16570c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) {
165854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
165954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
166054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
166154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
166254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
166354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
166454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
166554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
166654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
166754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
166854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
166954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
167054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1671481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
167254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
167354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
167454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1675457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1676457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
167789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1681457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1682b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1683b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1684a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1685c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1686c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
16894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
169489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
16954a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
16967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1697783e4da72aa203a645737dec81b001341951a942Vadim Girlin	/* check GPR limit - we have 124 = 128 - 4
1698783e4da72aa203a645737dec81b001341951a942Vadim Girlin	 * (4 are reserved as alu clause temporary registers) */
1699783e4da72aa203a645737dec81b001341951a942Vadim Girlin	if (ctx.bc->ngpr > 124) {
1700783e4da72aa203a645737dec81b001341951a942Vadim Girlin		R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1701783e4da72aa203a645737dec81b001341951a942Vadim Girlin		r = -ENOMEM;
1702783e4da72aa203a645737dec81b001341951a942Vadim Girlin		goto out_err;
1703783e4da72aa203a645737dec81b001341951a942Vadim Girlin	}
1704783e4da72aa203a645737dec81b001341951a942Vadim Girlin
17053b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1709cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1716f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1717f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
17264a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1727a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1728a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1729a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1730a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1731a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1732a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1733a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1734a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1735a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1736a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1737a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
17384a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1739f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1740f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1741f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1742f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1743f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
17444a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
17453efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
17463efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
17473efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
17483efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
174980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
175080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
175180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
17524a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
17547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
176047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
176147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
17627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
17637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
17647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1767dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1769dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1770d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1771d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1772dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1773d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1774d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1775d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1776dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1777dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1778dffad730df17983cfaef0808555a8c26cad0aa15Christian König
17799b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1780dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1781dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17824a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1783dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1784dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1786d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1787d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1788d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1789d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
17904a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
179180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1793d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1794d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17964a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1798d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
17994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
18004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
18054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
18077a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
18084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
18097a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18139b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18164a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1823d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1824d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1826d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1827d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1828d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1829d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18309b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
18319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
18329b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
18339b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
18349b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
18359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1836d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1837d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1838cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1839cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1840cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1841cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1842cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1843cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1844cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1845cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1846cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1847cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1848cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1850cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1851cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1852cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1853cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1854cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1855cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1856cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1857cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1858cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1859cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1860cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1861cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1862cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1863cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1864cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1865cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1866cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1867cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1868cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
18734a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
18747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
18757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
18774a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
18797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
18817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
18847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
18867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
18897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
18907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
18917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
18927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
18937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1894d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1895d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{
1896d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1897d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int i, j, k, r;
1898d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct r600_bytecode_alu alu;
1899d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1900d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	for (k = 0; k < last_slot; k++) {
1901d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1902d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			continue;
1903d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
1904d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		for (i = 0 ; i < 4; i++) {
1905d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1906d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.inst = ctx->inst_info->r600_opcode;
1907d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1908d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1909d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			}
1910d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1911d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.dst.write = (i == k);
1912d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (i == 3)
1913d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				alu.last = 1;
1914d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
1915d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (r)
1916d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				return r;
1917d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		}
1918d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	}
1919d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	return 0;
1920d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie}
1921d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
19227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
192388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
192488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
192588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
192688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
19271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
192888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
192996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
193096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
193196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
193296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
193396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
19344a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
19364a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1937a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
193888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
193988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
194088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
194188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
194288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
194388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
19457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1946921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
194788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1948a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
194996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1950ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
195188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19524a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
195388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
195488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
195588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19564a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1957a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
19587ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
195988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
196088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
196188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
196288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
196388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
196488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
196588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19664a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
196788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
196888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
196988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19704a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1971a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
197288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
197388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
197488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
197588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
197688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
197788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
197888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
197988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
19807ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1981921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
198288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1983921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1984ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
198596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
198689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1987a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1988a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
198996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
199096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
199196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
199296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
199396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
199496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
199588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19964a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
199788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
199888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
199992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
200092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
200192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
20047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20054a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
20154a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
20247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
20257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
20287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
20297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
20307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
20317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
20327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
203392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
203492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
203592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20364a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
203792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
2038dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
203992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
204192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
204292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
204388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
20444a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
204588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
204688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
204788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
204888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
204988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
205088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
205188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
205288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
20534a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
205488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
205588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
205688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
205788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
2058be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
2059be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2060be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
2061be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
20624a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2063a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2064be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
2065be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
206680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2067be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
206888f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
20694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
207088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
207188f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
207288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
207388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
207488f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
207588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
207692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
207792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
207892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20794a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
208192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
208257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
208357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
208457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
208557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
20861fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
208757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
208857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
208957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
209092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
209192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
209257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
209389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
20954a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
20977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
21007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
21027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
21047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
21057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21074a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21124a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
21147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
211592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
21167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21194a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
212357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
212492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
212592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
212657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
212789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
21294a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
21337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
21357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
21377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21404a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21454a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
214857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
21497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
215657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
215792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
2159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
21604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
216480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
2167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
2177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
21784a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
218280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2187ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2190ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2191ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2192ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2193ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
219492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
219592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
219692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2197094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
2198094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
21994a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2200094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
2201094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
2202094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
22034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2204094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
22054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2206094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
22074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2208921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
22094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
22104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
22114502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
22124502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
22134502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
22144a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
22154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
2216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
2217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
2218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
22194a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2220094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
2221094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
2222094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
22234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
22244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
22254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
22264502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
2227094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
2228094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
2229094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
22300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
22310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
22320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22334a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
22340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
22350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
2236f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
22374a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2238f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
22394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2240f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2241f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
2242f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2243f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
2244f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
2245f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
2246f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2247f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
22484a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2249f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
2250f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
2251f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
22520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
22530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
22546a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
22556a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
22576a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
225889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
2260f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
22614a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2263f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
2264f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
2265f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
2266f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
22677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
22687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
22717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22734a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
2278f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
22794a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2281f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
2282f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
22832fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
22842fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
22852fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
22867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
22926a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
22936a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
22940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
229586f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
22964a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2297a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
229886f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
229986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
23004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
23014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
23020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
23030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
23040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
23050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
23060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
23074a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
23090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
23100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
231189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
23127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
23144a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
23207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
23237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
23244a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
23257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
23304a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
23337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
23347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
23357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
23377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
23400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
2341abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23428567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
23434a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23448567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
23458567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
23468567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
23478567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
23488567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
23494a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
23508567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
23518567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
23528567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
2353abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
23544a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2355abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
23564a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2357abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2358abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
2359abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2360abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
23614a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2362abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2363abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2364abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
2365abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
23664a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2367abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2368abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
2369abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
2370abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2371abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
2372abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
23734a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2374abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2375abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2376abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
23780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
23790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
238042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
238142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
238242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23834a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
238442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
238542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
23864a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2387df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2388370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
2389df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2390df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
2391df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2392df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
2393df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
239442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
23954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
23964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
239742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
239842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
239942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
240042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
24014a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
240242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
240342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
240442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
240542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
240642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
240742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
2408a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
24097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
24107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24114a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2412a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
24137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
24147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
24154a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2417a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
24187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
241980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
24227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
24234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
24257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
24267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
24277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
24287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
24297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
2430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
2432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24334a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
2435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24364a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
2438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
24394a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
2441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
2448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2449a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
24527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
24537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
24554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
24567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
24594a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
24647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
24667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
24734a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24754a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
24787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
24804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
24864a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
24937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
24997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
25007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2502a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
25034a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
25074a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2508a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25094a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
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	/* b * LOG2(a) */
25174a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
251866f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
25194a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2522a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2523a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25244a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2525a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2526a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2527a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
25284a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2529a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2530a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2531a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2532a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2533a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25344a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2535a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2536a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2537a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2538a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2539a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2541332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2542332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2543332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
254429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int i, r, j;
2545332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2546332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2547332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
254929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int tmp3 = r600_get_temp(ctx);
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
25944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2595332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2596332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2597332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2598332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2599332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2601332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2605332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
26084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2609332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2611332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2613332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2619332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2621332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2624332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2625332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2627332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2629332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
26364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
26374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2647332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2648332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
26524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2669332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
26784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
26814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
26824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
26844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2689332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2690332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
269229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
269329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp3.x = u2f(src2) */
269429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
269529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2696332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
269929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
270029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
270329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp0.x = recip(tmp3.x) */
271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 3; j++) {
271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
271929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 0);
272029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp3;
272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (j == 2)
272529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.last = 1;
272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
272929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
273429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
273529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].value = 0x4f800000;
273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
274329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (r)
274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
274629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
274829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
274929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
275229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp3;
275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
27594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
27634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
276429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
276529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
276629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
276729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
276829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
276929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
277029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
277129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
277229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
277329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
277429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
277529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
277629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
277729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
277829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
27794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
278129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
278429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2785332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
278629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
2789332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
279029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
279229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
279329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
279429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
279529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
28034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
280429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2806332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
280729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
280829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
281129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
281229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
281329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
281429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
281529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
281629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
281729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
281829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
281929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
282029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
282129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
282229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
282329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
28244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
28264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
28284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
28314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
28344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
28364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
284229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
284329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
284429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
284529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
28464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
284729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
28504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
285129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
285229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
28534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
285529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
285629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
285829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
285929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
286229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
28644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2867332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
286929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
287029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
287129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
287229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
287329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
287429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
287529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
287629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
287729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
287829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
287929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
288029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
288129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
288229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
288329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
288429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
288529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
2886332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2891332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
28984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
29004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
29014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
29024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
29044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
29064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
290829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
290929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
291029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
291129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2912332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
291329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
291429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
291529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 3);
29164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
291729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
291829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 2;
29194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
292029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
292129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
29224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
292329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
292429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
292529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
292629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
292729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		} else {
292829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
292929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
293029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
293129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
293229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 3;
293329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
293429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
293529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
293629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 2;
293729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
293829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
293929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 0;
294029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
294129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
294229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
294329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
294429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
29454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
29474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2949332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2950332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2952332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2953332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
29584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2959332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2961332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2962332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2964332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2966332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2967332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2969332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2970332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2975332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2976332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2978332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2979332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
29814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
29834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2984332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
29864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
29874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
29884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
29914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
29924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
29934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
29944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
29954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
29974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
29994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
300129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
300229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
300329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
300429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
30054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
300729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
30094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
301129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
30124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
301429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 0;
301629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
301729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
301829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
30274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
302929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
303029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
303229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
303329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
303429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
303529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
303629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
303729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
303829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
303929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
304029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
304129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
304229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
304329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
304429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
304529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
304829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
304929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
305029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
305129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
305329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
305429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
305529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
30564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
305729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
305829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].sel = tmp2;
305929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].chan = 1;
306029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
306129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
306229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
306329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
306429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
306529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 2;
306629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
306729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
306829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
306929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
307029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
307229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
307329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
307529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
307629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
307729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
30784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
307929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
308029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
308129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
308229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
308329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
308429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
308529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
308629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
308729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 2;
308829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
308929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
309029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
309129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
309229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
30954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
30974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
31004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
31044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
31054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
31074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
31084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3119332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3120332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
31214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
3122332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
3123332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
31254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
31284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3132332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
3136332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
31474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
31514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
31534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3157332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3158332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
3160332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
3162332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3164332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3165332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
3167332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
3168332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
3171332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
32214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
32254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
32274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
32284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
32314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3236332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
32374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3238332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
3239332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
32414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
32434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3247332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
32524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
3259332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
3262332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
32644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3266332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
32714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
32794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3290332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3291332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
32954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
32964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
3297332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3300332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3301332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
33054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
33454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
33494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
33504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
33514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
33614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
33624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
33694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
33704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
33794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
33804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
3381332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
3382332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
3383332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
33854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
33874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
33904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
33924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
33954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
33974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
34004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
34014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
34024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
34034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3404a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3405a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
3406a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{
3407a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3408a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct r600_bytecode_alu alu;
3409a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int i, r;
3410a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3411a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
3412a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3413a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3414a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3415a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3416a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3417a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3418a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
3419a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3420a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.sel = ctx->temp_reg;
3421a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.chan = i;
3422a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.write = 1;
3423a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3424a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3425a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (i == last_inst)
3426a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3427a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3428a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3429a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3430a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3431a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3432a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3433a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3434a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3435a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3436a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3437a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = ctx->inst_info->r600_opcode;
3438a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3439a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3440a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3441a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].sel = ctx->temp_reg;
3442a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].chan = i;
3443a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3444cd97a5f660399212a23b6dcd02906231f2dc5525Dave Airlie		if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT)
3445a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3446a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3447a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3448a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3449a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3450a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3451a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	return 0;
3452a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin}
3453a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
34546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
34556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
34566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
34576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
34586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
34596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
34606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
34616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
34636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
34696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
34716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
34726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
34766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
34856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
34916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
34926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
34956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
34976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
34996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
35006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
35026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
35036b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
35046b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
35056b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
35066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
35076b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
35086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
35096b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
351042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
351142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
351242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
351342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
351442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
351542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
351642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
351742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
351842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
351942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
352042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
352142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
352242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
352342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
352442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
352542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
352642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
352742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
352842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
352942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
353042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
353242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
353342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
353442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
353642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
353742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
353842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
353942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
354042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
354142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
354342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
354442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
354542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
354642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
354842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
354942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
355042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
355142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
355342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
355542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
355642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
355842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
356042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
356142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
356242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
356342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
356442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
356542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
356642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
356742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
356842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
356942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
357042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
35716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35730d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
35740d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
35750d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35764a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3577921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
35780d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35790d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
35800d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35814a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3582a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35830d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
3584cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
35850d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
3586cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
35870d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35884a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3589921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
35904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
35910d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35920d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
35930d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
35944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
35950d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
35960d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
35970d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
35980d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35990d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
36000d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
36014a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3602a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
36030d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
360480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
36050d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36060d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3607cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
36080d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
36090d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3610921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
36110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
36120d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
3614cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
36150d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36160d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
36170d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
36184a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
36190d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
36200d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
36210d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
36220d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
36230d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
36240d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3625cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
36274a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3628cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
3629cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
36314a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3633a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
36346c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
3635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
3636a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
363780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
3639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
3640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
3642cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
3643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
36444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
3646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
3647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
3648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
3649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
3652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
3653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36544a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
3656dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
36587be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
36597be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
36607be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
36617be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
36624a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36677be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
366880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
3670cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
36727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
3673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36754a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
36797be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3680cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3681cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
3683cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
3684cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
3687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
36894a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3691cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36924a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3693cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3694a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
369580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
3697a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
3699cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
3700cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
3701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
3702921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3707cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3708921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3710cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3711cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3712e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3713e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3714e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3715e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3716e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3717e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3718e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
37254a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
37297be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
37326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
37336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
37346415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37356415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37366415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3737192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3738192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
37396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
37406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
37426415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
37436415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
37446415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37456415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
37476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
374933241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
375033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
375196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
375233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37534a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
37544a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3755641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
375640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3758da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3759da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
37606d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	const boolean src_requires_loading = inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ &&
37616d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák                                             tgsi_tex_src_requires_loading(ctx, 0);
376278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
37636d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	unsigned sampler_src_reg = inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ ? 0 : 1;
376478293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3765641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37666415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3767641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
37691d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
37701d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
37711d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
37721d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
37731d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
37741d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
37751d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
37761d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
37771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
377813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
377913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
378013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
378140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
378240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
37834a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
378440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
378540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
378640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
378740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
378840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
378940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
379040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
379140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
379240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
379340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
379440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
379540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
379640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
37974a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
379840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
37994a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
380040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
380140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
380240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
380340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
380440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
38054a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
380640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
380740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
380840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
380913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
381040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
381140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
381240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
381340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
381440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
381540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
381640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
381740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
381840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
381940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
382040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
382140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
382240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
382340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
382440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
382540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
38264a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
382740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
382840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
382913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
383013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
38317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3832b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
383389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
38357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38364a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38384a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38464a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
38534a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38554a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38614a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
38659d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
38674a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3868a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
38707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
38714a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
38754a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3876b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
38794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3880a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3881921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3882b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3883b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3884b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3885b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3886b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
38874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3888b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3889b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
389078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3891b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38949783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
38959783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
38966d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ &&
38976d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ) {
3898261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
38990e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
39000e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
39044a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3905a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
39064a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
39074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
39134a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
391989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39214a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
39247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
39257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
39267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
39324a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39374a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
39407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
39417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
39427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
39447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
39464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
39507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3952bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
39537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
39554a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3956a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3961bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3966a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39724a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39764a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3977a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3982bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3987a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3989bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3990bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3991bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3992bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
39944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
39979783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
39989783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
39999783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
40009783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
40019783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
40029783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
40039783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
40049783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
40059783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
40069783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
40079783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
40089783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
40099783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
401078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
4011bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
4012bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
4013bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
401478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
4015b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
40164a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4017a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
40184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4019b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
4020b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
4021b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
4022b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
4023b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
40244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4025b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
4026b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
4027b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
402878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
4029b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
4030b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
40317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4032bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
4033929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4034929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
40356b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
40369783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
4037929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
4038929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
4039de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
4040de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
4041de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
4042de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4043de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
4044de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
4045de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4046c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
4047c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
4048c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
4049de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
4050de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
4051de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4052de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
4053de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
405433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
40554a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
4056bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
40576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
40586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
4059077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
4060641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
40616c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
40629d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
40639d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
40649d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
40659d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
40666d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák
40676d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ) {
40686d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_x = 4;
40696d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_y = 4;
40706d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_z = 4;
40716d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_w = 4;
40726d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	} else if (src_loaded) {
407378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
407478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
407578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
407678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
407778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
407878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
407978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
408078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
408178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
4082244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
408378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
40849a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
4085bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
4086bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
4087bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
4088bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
4089bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
4090bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
40919783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
40929783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
40939783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
40949783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
40959783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_w = 2; /* route Z compare value into W */
40969783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
4097bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40986b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
40996b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
410001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
410101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
410201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
41036b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
41046b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
4105bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
41061d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
41071d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
41081d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
410969d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
4110929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
4111929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
4112929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
4113929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4114929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
41156b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
4116929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
4117929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
4118929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
411978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
4120929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
4121929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
4122929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
4123929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
4124929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
4125929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
4126929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
4127929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
4128929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
4129929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
4130929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
4131929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
4132929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
4133929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
4134929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
4135929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
4136929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
4137bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
41384a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
4139bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
4140bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
4141bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
4142bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
4143bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
414433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
414533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
4146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
4147b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
4148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41494a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4150dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
4152b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
4153b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4154c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
41551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
4156c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
4157c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4158c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
4159c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
41604a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4161c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
41624a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
41634a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4164c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
416580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4166c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
4167c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
4168c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
4169c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
41704a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4171c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
4172c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
4173c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
4174c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
4175c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
4176c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
4177b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
4178dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4179dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4180dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4181dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41824a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4183a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4184921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
4185b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
41864a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
41874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
4188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4189b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4190dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4191b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4192b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4193b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
41944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4195b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4196b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4197b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4198b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4199b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
4200dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4201dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4202dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4203dffad730df17983cfaef0808555a8c26cad0aa15Christian König
42044a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4205a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4206b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
4207b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
42084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4209b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4210b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4211dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4212b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4213b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4214b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
42154a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4216b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4217b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4218b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4219b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4220b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
4221dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4222dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4223dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4224dffad730df17983cfaef0808555a8c26cad0aa15Christian König
42254a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4226a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4227b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
42284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4230b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
4231b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
4232dffad730df17983cfaef0808555a8c26cad0aa15Christian König
423380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4234b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4235dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4236b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4237b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
42384a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4239b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4240b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4241b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4242dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
4243b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
4244b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
424587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
424687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
424787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42484a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
424987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
4250dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
425187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42527be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
42537be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
42547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
425587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42564a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4257a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
42584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
42604a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
426180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
426287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
426387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
426487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
42657be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
426687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
42674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
426887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
426987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
42707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
427187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
427287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
427387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
42750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
42760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42770e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
42780e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
42794a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
42800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
42810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
42820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
42840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
42850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
42874a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4288a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
42890e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
42904a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
42914a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
42920e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
42930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
42940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
42950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
42960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
42970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
42980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
43000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
43010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
43020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
43040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
43054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
43060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
43070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
43080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
43090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
43114a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4312a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
43130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43140e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
43154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
43164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
43170e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
43180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
43190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
43200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
43210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
43220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
43230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
43250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
43260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
43270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
43290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
433080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
433180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
43320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
43330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
43340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
43350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
43360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
43374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
43380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
43390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
43400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
43410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
43420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
43430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
43440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
43450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
434636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
434736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
434836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
43494a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
435009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
43517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
435236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
435336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
435436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
43554a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
435636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4357a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
43584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
435936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
436036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
436136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
436236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
436336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
43644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
436536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
436636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
436736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
436889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
43727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
437336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
43767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
43777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
43787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
43797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
43804a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
43847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
43857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
43877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
43887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
43907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
43917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
43927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
43934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
43947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
43957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
43967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
439736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
43987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
439936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
440036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
44014a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
440236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4403a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
44044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
440536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
440636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
4407b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
4408b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4409b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
4410b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
4411b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
441236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
441336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
441436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
441536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
441636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44174a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
441836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
441936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
442036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
442136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
442236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
442336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
442489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44264a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
442936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
44337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
443636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44374a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
44417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44444a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
444536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
44497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
445636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
445736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
445836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
445936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
44604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
446136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4462a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
446336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
446436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
446536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
446636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
446736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
446836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
446936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
44704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
447136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
447236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
447336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
447436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
447536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
447687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
4477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
4478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
4479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
44804a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
44827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
4483460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4484f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
4485460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
448689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44884a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4489460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44914a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44924a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
44937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
44997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
45004a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
4504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45064a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45094a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45104a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
45147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4520460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4521460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4522460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
4523460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4524460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4525460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4526460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
4527460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4528460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4529460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45304a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4531460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4532460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4533460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4534460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4535f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4536460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4537460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
453889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45404a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
454196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45444a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
454596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
45527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45534a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45584a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45614a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45624a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
45667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
457396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45744a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
457596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
457696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
457796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
457896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
457996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
458096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
458196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
458296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
458396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
458496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45854a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
458696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
458796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
458896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
458989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45914a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
45937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
45947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
45957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
460296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46034a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46084a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
46107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
46117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
461296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
461796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
462296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
462389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46254a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
46287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
46297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
46337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
46367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46374a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
46457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
464696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
46497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
465196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
465696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
465896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
465996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
466096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46624a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
466396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
466496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
466596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
4666460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
4669460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4670460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4671460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46724a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4673460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4674460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4675460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4676460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4677f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
4678460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
467989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46814a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4682460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46844a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46854a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
4686460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
4693460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46944a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46994a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
47007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
47017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
47024a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47034a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
47047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
47057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
47067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
47077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
47087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
47097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
47104a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
47117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
47127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
47137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4714460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4715460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4716460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4717460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
47184a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4719460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4720460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4721460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4722460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4723460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4724460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4725460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4726460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4727460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4728460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
47294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4730460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4731460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4732460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4733460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4734460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4735460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4736460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
473798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
473898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
473998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47404a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
474198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4742a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47434a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
474498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
474552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
474652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
474752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
474852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
474952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
475052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
475152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
47529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
47538e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
47549b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
475552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
475652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
475752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
475852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
475952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
47608e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
476198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
47628e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
47638e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
47644a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
476598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
476698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
47678e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
47688e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
476998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
477098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
477198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
477247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
477347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
477547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4776a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47777ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
47787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4779077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4780077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
47814a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47828e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4783077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4784077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4785077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47864a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4787077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4788077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4789077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4790077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
47918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
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;
47997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4800077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4801077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
48024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
48038e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4804077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4805077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4806077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
48074a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4808077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
48097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
48109b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
48118e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
48128e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
48138e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
48148e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
48158e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
48168e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
48178e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
48188e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
48198e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
48209b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
48217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
48227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
48237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
48247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
48257ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48268e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
482747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
482847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
482947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
483057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
483157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
483257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
48334a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
483457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
483557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
483657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
48374a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
483857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4839a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
484080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
48417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
484357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
484457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
484657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
484757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4848a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
484957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
485057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
485257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
485357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
485457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
48554a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
485657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
485757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
485857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
485957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
486057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
486157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4862a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4863a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48644a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4865a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4866a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48674a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4868a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4869da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.execute_mask = 1;
4870da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.update_pred = 1;
4871a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4872a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4874a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4875a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48764a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4877a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
48797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4881a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48824a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4883a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4884a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4885a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4886a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4887a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4888a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4889a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
48912bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
48922bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
48932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
48942bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
48954f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
48962bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
48974f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
48982bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
48992bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
49002bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
49012bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
49024f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
49032bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
49042bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
49054f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
49062bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
49072bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
49082bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
49092bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
49102bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
49112bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
49122bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
49134a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
49148813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
49158813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
49168813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
49172bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4918a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4919a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4920a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
492109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4922a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
492309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
492409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
492509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
492609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
492709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
492809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
492909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
493009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
493109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
493209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
493309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
493409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
493509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4937a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
493809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
493909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
494009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
494409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
494809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4949a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4950a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4951a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
495209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
495309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
495609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
49597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
496409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
496509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
496609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
497309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
497409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
497809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
498109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49844a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
49854a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4989a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
499109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4992a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
499309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
499609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
499809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
499909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
500009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
500109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
500209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
500309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
500409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
500509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
500709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
500809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
500909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
501009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
501109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
501209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50134f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
501409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
501509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
501609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
501709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
501809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
501909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50204f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
502109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
5022370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX work out offset */
502309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
502409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
5025a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
502809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
503409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
503509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
503709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
503809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
504009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
504109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
504209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
504309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
504409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
504609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
504709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
504809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50494a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
505009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
505109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
505209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
505309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
505409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
505509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
505609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
505709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
505809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
505909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50608b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
506109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50624a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
506309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
506409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
506509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
506609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
5067a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5068a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5069a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5070a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
5071a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
50724a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
5073a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
5074a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
507509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
5076a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
5077a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5078a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5079a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5080a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
5081a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
5082a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
5083a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
5084a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
5085a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
5086a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
5087a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5088a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
5089a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5090a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
5091a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
509209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
5093a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
509409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
509509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
509609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
509709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
509809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
509909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
510009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
510109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
51024a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
510309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
510409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
5105a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
510609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
510709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
510809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
510909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
511009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
511209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
511309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
511409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
51154a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
511609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
511809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
511909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
512009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
512109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
512209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
512309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
512409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
512509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
512609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
512709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
512809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
512909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
513009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
513109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
513209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
513309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
5134370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX add LOOPRET support */
513509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
513609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
513709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
513809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
513909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
514009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
514109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
514209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
514309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
514409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
514509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
514609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
514709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
514809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
514909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
515009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
515109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
515209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
515309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
515409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
51554a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
515609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
515709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
515809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
515909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5160a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5161a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5162a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5163cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
5164cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
5165cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5166cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
5167cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
5168cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
5169cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5170cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
5171cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5172cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5173cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5174cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5175cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5176cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5177cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
5178cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
5179cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
5180cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5181c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
5182cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
5183cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5184cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5185cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
51869b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
5187cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5188cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5189cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5190cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5191cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5192cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5193cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5194cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5195cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5196cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5197cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5198cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5199cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5200c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5201cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5202cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
5203cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
5204cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5205cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5206cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
5207cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
5208cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5209cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5210cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5211cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5212cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5213cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
5214cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
5215cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
521798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
52190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5220df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
5221370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
5222df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
5223df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
5224df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
5225df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
5226df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
522742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
522836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5229460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5232cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5233cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
523457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5235dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5237d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5238be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5241b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52493af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52513af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5252df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
52537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
52544558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5255a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
52560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52597a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5261e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
526288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
52633af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
52643af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
52654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52710d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52730d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
527488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5275d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
52760d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5278b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
527913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5280b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52879f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52910d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
529287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
529392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5294c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5297cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5298ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
529909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5300a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5304a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5305a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53118c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5312c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5313cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
53140ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5315d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
5316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5318c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5319c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
53204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5321cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53231d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
53241d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
532509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
532809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
533009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53326d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5347094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5351bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
5352332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5353c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5354c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
53555893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5356c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5357d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
53580196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5359b8e9cf5d965ce09227cd9875c4381c73f237f196Marek Olšák	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans},
53609a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5361c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
53624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5363c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5364c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5365c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
53664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5367850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5368c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5369c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5370d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
53717383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5372c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
5373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5377cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5378a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,  0, 0, tgsi_unsupported},
5379a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
5380cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5381cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5382cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5383cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5384cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5385cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5386a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5387cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5388cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
53899b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
53909b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
53916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
539242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
539550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
539650526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
539798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
539850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
539950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
540050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
54018ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
540250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5403112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
540450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
540550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
540650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
540750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
540850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
540950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
541050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
541150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
541250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
541350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
541450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
541550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
541650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
541850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
541950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
542150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
542450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
542550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5426df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
542750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
542850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
542950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
543050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
543150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
543250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
543450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
543650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
543750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
543850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
543950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
544050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
544650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
544850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
544950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
545050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
545150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
545250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
545313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
545450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
545550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
54627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
54667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
54677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5468c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
54697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
54737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
54747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
54757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54858c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5486608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5487cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
54887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5489d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
54907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5492cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5493cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
54944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5495cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
54967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54971d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
54981d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
54997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
55007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
55037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
55057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55066d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
55077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
55227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
55237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5525a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
5526332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5527cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5528cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5529cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5530cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5531d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5532cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5533a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
5534b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5535cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
55364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5537cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5538cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5539cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
55404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
55419b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5542cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5543cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5544d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
55457383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5546cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
55477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5551cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5552a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5553a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5554cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5555cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5556cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5557cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5558cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5559cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5560a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5561cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5562cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
55639b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
55649b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
55656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
556642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
55677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
55697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
55707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
55717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
55727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
55747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
55757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
55767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
55777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
55787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
55797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
55837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
55847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
55857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
55867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
55877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
55887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
55907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
55987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5600df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
56017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
56027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
56037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
56047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
56057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
56067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
56087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
56107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
56117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
56127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
56137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
56147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
56207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
56227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
56237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
56247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
56257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
562713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
56287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
56297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
563650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
563950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
564050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
564150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5642c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
564350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5646ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
564750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
564850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
564950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
565050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
565550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56598c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5660f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5661cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
56620ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5663f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
566450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
566550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5666f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5667f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
566829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5669cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
567050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56711d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
56721d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
567350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
567450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
567750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
567950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56806d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
568150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
568250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
568750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
568950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
569650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
569750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
569850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5699f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
570029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5701cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5702cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5703f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5704f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5705f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5706f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5707f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5708f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5709f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
571029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5711f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5712f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5713f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
571429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5715d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5716f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5717f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5718f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5719f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5720f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
572150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
572250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
572350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
572450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5725cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5726a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5727a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5728cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5729cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5730cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5731cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5732cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5733cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5734a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5735cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5736cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5737f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
57389b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5739f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5740f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
574150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
574250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5743