r600_shader.c revision 4acf71f01ea1edb253cd38cc059d4af1a2a40bf4
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
261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_src_from_byte_stream(unsigned char * bytes,
262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx)
263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned i;
265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned sel0, sel1;
266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel0 = bytes[bytes_read++];
267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel1 = bytes[bytes_read++];
268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].sel = sel0 | (sel1 << 8);
269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].chan = bytes[bytes_read++];
270ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].neg = bytes[bytes_read++];
271ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].abs = bytes[bytes_read++];
272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].rel = bytes[bytes_read++];
273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].kc_bank = bytes[bytes_read++];
274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for (i = 0; i < 4; i++) {
275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8);
276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx,
281ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
282ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
283ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned src_idx;
284ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst0, inst1;
285ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
286ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
287ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for(src_idx = 0; src_idx < 3; src_idx++) {
288ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		bytes_read = r600_src_from_byte_stream(bytes, bytes_read,
289ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								&alu, src_idx);
290ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
291ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
292ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.sel = bytes[bytes_read++];
293ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.chan = bytes[bytes_read++];
294ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.clamp = bytes[bytes_read++];
295ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.write = bytes[bytes_read++];
296ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.rel = bytes[bytes_read++];
297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst0 = bytes[bytes_read++];
298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst1 = bytes[bytes_read++];
299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.inst = inst0 | (inst1 << 8);
300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.last = bytes[bytes_read++];
301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.is_op3 = bytes[bytes_read++];
302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.predicate = bytes[bytes_read++];
303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle = bytes[bytes_read++];
304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle_force = bytes[bytes_read++];
305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.omod = bytes[bytes_read++];
306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.index_mode = bytes[bytes_read++];
307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_alu(ctx->bc, &alu);
308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* XXX: Handle other KILL instructions */
310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) {
311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->shader->uses_kill = 1;
312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		/* XXX: This should be enforced in the LLVM backend. */
313ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->bc->force_add_cf = 1;
314ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
315ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu,
319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned pred_inst)
320ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
321ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->inst = pred_inst;
322ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->predicate = 1;
323b4789860c4416ba700ac5edeb692b59e33d45276Tom Stellard	alu->dst.write = 0;
324ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].sel = V_SQ_ALU_SRC_0;
325ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[1].chan = 0;
326ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->last = 1;
327ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_alu_type(ctx->bc, alu,
328ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
329ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
330ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
331ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	fc_pushlevel(ctx, FC_IF);
332ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
333ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
334ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
335ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
336ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			struct r600_bytecode_alu *alu, unsigned compare_opcode)
337ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
338ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned opcode = TGSI_OPCODE_BRK;
339ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (ctx->bc->chip_class == CAYMAN)
340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else if (ctx->bc->chip_class >= EVERGREEN)
342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else
344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	llvm_if(ctx, alu, compare_opcode);
346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_loop_brk_cont(ctx);
347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_endif(ctx);
348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst;
355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0);
357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst = bytes[bytes_read++];
358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	switch (inst) {
359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 0:
360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		llvm_if(ctx, &alu,
361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 1:
364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_else(ctx);
365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 2:
367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_endif(ctx);
368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 3:
370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_bgnloop(ctx);
371ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 4:
373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		tgsi_endloop(ctx);
374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 5:
376ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
377ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE));
378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
379ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 6:
380ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
382ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
383ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	case 7:
384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		{
385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			unsigned opcode = TGSI_OPCODE_CONT;
386ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (ctx->bc->chip_class == CAYMAN) {
387ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
388ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&cm_shader_tgsi_instruction[opcode];
389ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else if (ctx->bc->chip_class >= EVERGREEN) {
390ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
391ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&eg_shader_tgsi_instruction[opcode];
392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else {
393ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
394ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&r600_shader_tgsi_instruction[opcode];
395ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
396ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			tgsi_loop_brk_cont(ctx);
397ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
398ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
39918617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard	case 8:
40018617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		r600_break_from_byte_stream(ctx, &alu,
40118617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
40218617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		break;
403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
404ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
406ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
407ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
408ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
409ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
410ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_tex tex;
412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.inst = bytes[bytes_read++];
414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.resource_id = bytes[bytes_read++];
415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_gpr = bytes[bytes_read++];
416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_rel = bytes[bytes_read++];
417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_gpr = bytes[bytes_read++];
418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_rel = bytes[bytes_read++];
419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_x = bytes[bytes_read++];
420ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_y = bytes[bytes_read++];
421ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_z = bytes[bytes_read++];
422ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_w = bytes[bytes_read++];
423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.lod_bias = bytes[bytes_read++];
424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_x = bytes[bytes_read++];
425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_y = bytes[bytes_read++];
426ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_z = bytes[bytes_read++];
427ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_w = bytes[bytes_read++];
428ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_x = bytes[bytes_read++];
429ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_y = bytes[bytes_read++];
430ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_z = bytes[bytes_read++];
431ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.sampler_id = bytes[bytes_read++];
432ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_x = bytes[bytes_read++];
433ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_y = bytes[bytes_read++];
434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_z = bytes[bytes_read++];
435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_w = bytes[bytes_read++];
436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_tex(ctx->bc, &tex);
438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
442e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
443e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	unsigned char * bytes, unsigned bytes_read)
444e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{
445e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	struct r600_bytecode_vtx vtx;
446e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	memset(&vtx, 0, sizeof(vtx));
447e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.inst = bytes[bytes_read++];
448e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.fetch_type = bytes[bytes_read++];
449e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.buffer_id = bytes[bytes_read++];
450e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.src_gpr = bytes[bytes_read++];
451e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.src_sel_x = bytes[bytes_read++];
452e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.mega_fetch_count = bytes[bytes_read++];
453e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_gpr = bytes[bytes_read++];
454e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_x = bytes[bytes_read++];
455e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_y = bytes[bytes_read++];
456e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_z = bytes[bytes_read++];
457e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.dst_sel_w = bytes[bytes_read++];
458e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.use_const_fields = bytes[bytes_read++];
459e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.data_format = bytes[bytes_read++];
460e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.num_format_all = bytes[bytes_read++];
461e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.format_comp_all = bytes[bytes_read++];
462e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.srf_mode_all = bytes[bytes_read++];
463c108831d4451f624167d2c433282c6ac63541a79Tom Stellard	/* offset is 2 bytes wide */
464e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.offset = bytes[bytes_read++];
4655cd6ce939d1158d0ee3dd376e2c95aeff49c6e27Tom Stellard	vtx.offset |= (bytes[bytes_read++] << 8);
466e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	vtx.endian = bytes[bytes_read++];
467e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
468e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
469e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		fprintf(stderr, "Error adding vtx\n");
470e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	}
471e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	/* Use the Texture Cache */
472e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
473e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	return bytes_read;
474e42df8e10a83e76565474f82330d34403da71b49Tom Stellard}
475e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
476ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
477ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes,	unsigned num_bytes)
478ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
479ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned bytes_read = 0;
4806f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard	unsigned i, byte;
481ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	while (bytes_read < num_bytes) {
482ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		char inst_type = bytes[bytes_read++];
483ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		switch (inst_type) {
484ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 0:
485ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_alu_from_byte_stream(ctx, bytes,
486ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
487ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
488ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 1:
489ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_tex_from_byte_stream(ctx, bytes,
490ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
491ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
492ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 2:
493ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_fc_from_byte_stream(ctx, bytes,
494ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
495ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
4966f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard		case 3:
4976f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
4986f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			for (i = 0; i < 2; i++) {
4996f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				for (byte = 0 ; byte < 4; byte++) {
5006f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					ctx->bc->cf_last->isa[i] |=
5016f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					(bytes[bytes_read++] << (byte * 8));
5026f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				}
5036f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			}
5046f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			break;
505e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
506e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		case 4:
507e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
508e42df8e10a83e76565474f82330d34403da71b49Tom Stellard								bytes_read);
509e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			break;
510ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		default:
511ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			/* XXX: Error here */
512ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
513ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
514ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
515ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
52772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
531c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
532a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
53672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
537a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
5398260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
5408260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
5418260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
54647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
54747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
55272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
55372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
55550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
55650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
5574a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
569fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
575fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
576fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
5777ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
579fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
580fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
58150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
58250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
5834a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
58450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
58550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
586738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
58750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
588738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
58950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
59050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
591fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
59250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
59350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
59450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
59550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
596fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
597fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
60150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
60250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
60350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
60450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
6054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
60650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
60750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
60850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
60950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
6107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
6117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
61221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
61321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
61421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
61521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
61621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
61721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
61821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
61921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
620738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
62121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
62221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
62321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
62421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
62521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
62621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
62721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
62821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
62921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
63021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
63121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
63221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
63321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
63421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
63521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
63621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
63721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
6387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
6390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
6400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
6410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
6430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
6440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
6450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
6460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
6480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
6490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
6500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
6510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
6520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
6530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
6540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
6550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
6560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
6590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
6600a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
6610a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6620a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
6630a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
6640a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
6650a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
6660a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
6670a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
6680a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
6690a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6700a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
6715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
6745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
6755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
6765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
6775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
6795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
6805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
6815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
6825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
6835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
6845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
6855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
6865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
6875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
6885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
6895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
6905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
6915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
6925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
6935b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
6945b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
6955b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
6965b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
6975b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
6985b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
6995b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7005b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
7015b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
7025b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
703725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
704725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
705725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
706725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
707725a820b926575265e6790601a0defd9c30947dcVadim Girlin
708725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
709725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
710725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
711725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
712725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
713725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
714725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
715725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
716725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
717725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
718725a820b926575265e6790601a0defd9c30947dcVadim Girlin
719725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
720725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
721725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
722725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
723725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
724725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
725725a820b926575265e6790601a0defd9c30947dcVadim Girlin
726725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
727725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
728725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
729725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
730725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
731725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
732725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
733725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
734725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
735725a820b926575265e6790601a0defd9c30947dcVadim Girlin
736725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
737725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
738725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
739725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
740725a820b926575265e6790601a0defd9c30947dcVadim Girlin
741725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
742725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
743725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
744725a820b926575265e6790601a0defd9c30947dcVadim Girlin
745725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
746725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
747725a820b926575265e6790601a0defd9c30947dcVadim Girlin
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
74972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
75296bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
75372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
7595b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
7601279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].interpolate = d->Interp.Interpolate;
7611279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].centroid = d->Interp.Centroid;
762024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
763725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
764c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			switch (ctx->shader->input[i].name) {
765c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_FACE:
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
767c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
768c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_COLOR:
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
770c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
771c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_POSITION:
772c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				ctx->fragcoord_input = i;
773c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
774c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			}
775725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
776c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				if ((r = evergreen_interp_input(ctx, i)))
777725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
778fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
77950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
7855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
786024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
7871279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->output[i].interpolate = d->Interp.Interpolate;
78891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
78991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
79091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
79191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
79291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
79391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
79491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
79591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
796e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák				ctx->shader->vs_out_point_size = 1;
79791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
79854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
79954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
80054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
80154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
80291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
80391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
80733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
80847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
81096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
811c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
812c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
813951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			if (!ctx->native_integers) {
814951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				struct r600_bytecode_alu alu;
815951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
81696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
817951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
818951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].sel = 0;
819951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].chan = 3;
82096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
821951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.sel = 0;
822951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.chan = 3;
823951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.write = 1;
824951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.last = 1;
82596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
826951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
827951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin					return r;
828951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			}
829c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
83039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
83139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
83772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
83872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
839be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
840be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
841be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
842be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
843be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
8447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
845fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
846fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
847fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
848fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
849fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
850fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
851fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
852fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
853fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
854fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
855fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
856fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
857fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
858fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
859fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
860fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
861fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
862fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
863fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
864fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
865fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
866fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
867fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
868fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
869fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
870fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
871fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
872fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
873fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
874fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
875fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
876fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
877fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
878fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
879fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
880fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
881fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
882fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
883fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
884fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
885fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
886fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
887370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
888fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
889fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
890fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
8911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
8921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
8931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
8941fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
8951fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
8961fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
8971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
8981fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
8991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
9001fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
9011fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
90296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
9031fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
9041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
9051fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
9061fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
9071fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
9081fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
9104a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
9111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
9121fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
9131fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
9141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
9151fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
9161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
91796bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
91839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
91939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
92039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
92139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
92239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
92339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
92439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
92539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
92639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
92739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
92839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
92939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
93039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
931c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
9321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
9331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
9341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
9351fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
9361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
9371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
939077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
940077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
9414a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
942077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
943077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
944077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
945077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
9464a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
947077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
948077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
949077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
950077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
9518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
952077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
953077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
954077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
955077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
956077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
957077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
958077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
959077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9604a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
961077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
962077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
963077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
964077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
9658e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
966077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
967077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
968077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
969077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
970077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
971077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
972077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
973077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
974077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
975077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
976077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
977077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
978077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
979077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
980077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
981d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
982077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9834a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
984077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
987077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
9897687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
9907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
9917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9924a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
9937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
9947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
9957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
9967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
9977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
9987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
9997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
10007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1006077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1011077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
1013077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
10157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10174a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
10227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10274a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
10327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
10337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
10347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
10377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
10387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
10407687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
10417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10434a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
10457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
10477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
10497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
10527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10554a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
10607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10654a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
1076725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1077725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
1078725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
1079725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1080725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
1081725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
1082725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
1083725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
1084725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1085725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1086725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1087725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
1088725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
1089725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1090725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
1091725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
1092725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
1093725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1094725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1095725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
1096725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1097725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
1098725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1099725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1100725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1101725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
1102725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1103725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
1104725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
1105725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
1106725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
1107725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1108725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1109725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
1110725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
1111725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
1112725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1113725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1114725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
1115725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
1116725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1117e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
111872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1119eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
11204acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct tgsi_token *tokens = pipeshader->selector->tokens;
11214acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct pipe_stream_output_info so = pipeshader->selector->so;
1122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
11235555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
1124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
11254a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
1126457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
1127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
112854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
112954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
1130ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Declarations used by llvm code */
1131ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bool use_llvm = false;
11327f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned char * inst_bytes = NULL;
11337f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned inst_byte_count = 0;
113472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1135ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1136ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	use_llvm = debug_get_bool_option("R600_LLVM", TRUE);
1137ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
1139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
1140951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin	ctx.native_integers = (rctx->screen->glsl_feature_level >= 130);
1141951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin
1142c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
1144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
1145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
1146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
1147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
1148f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1150725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
1151c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	ctx.fragcoord_input = -1;
1152725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
115354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
1154725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1155725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1156feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
1157feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
1158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
1159076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
1160076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
1161076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
1162f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
1163f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
1164f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
1165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
1166076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
1167076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
1168076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
1169076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
1171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
1172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
1174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
1176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
1177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
1178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
1179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
1180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
1181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
118489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
11854a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1186f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
11874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1188f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
119089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
119284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
1193ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1194ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* LLVM backend setup */
1195ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1196ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm && ctx.info.indirect_files) {
1197ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		fprintf(stderr, "Warning: R600 LLVM backend does not support "
1198ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"indirect adressing.  Falling back to TGSI "
1199ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"backend.\n");
1200ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		use_llvm = 0;
1201ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1202ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1203ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		struct radeon_llvm_context radeon_llvm_ctx;
1204ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		LLVMModuleRef mod;
1205ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned dump = 0;
1206ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx));
1207ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1208ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens);
1209ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
1210ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			dump = 1;
1211ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1212ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count,
1213ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard							rctx->family, dump)) {
1214ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			FREE(inst_bytes);
1215ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			radeon_llvm_dispose(&radeon_llvm_ctx);
1216ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			use_llvm = 0;
1217ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			fprintf(stderr, "R600 LLVM backend failed to compile "
1218ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"shader.  Falling back to TGSI\n");
1219ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		} else {
1220ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_OUTPUT] =
1221ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					ctx.file_offset[TGSI_FILE_INPUT];
1222ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1223ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_dispose(&radeon_llvm_ctx);
1224ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1225ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1226ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* End of LLVM backend setup */
1227ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1228ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (!use_llvm) {
1229ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx.file_offset[TGSI_FILE_OUTPUT] =
1230ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_INPUT] +
1231ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1232ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
12344d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1235d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
123697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
123797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
123897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1239d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
12407728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
12418e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
12424d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
12438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
1244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1245cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
1246cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
12475555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
1248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
1250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
1251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
1252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
1253cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1254cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
1255cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
1256cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
1257cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
1258cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1259cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1260cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1261cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1262cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
1270725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1271725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
1272725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
127391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
127491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1275725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
1276725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
127791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
127891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
127991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
128091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
128191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
1282725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1283725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1284725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
1285725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1286725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
1287725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
1288725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1289725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1290725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1291c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	if (ctx.fragcoord_input >= 0) {
1292cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		if (ctx.bc->chip_class == CAYMAN) {
1293cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			for (j = 0 ; j < 4; j++) {
1294cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				struct r600_bytecode_alu alu;
1295cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1296cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1297cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1298cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].chan = 3;
1299cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie
1300cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1301cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.chan = j;
1302cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.write = (j == 3);
1303cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.last = 1;
1304cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1305cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie					return r;
1306cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			}
1307cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		} else {
1308cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			struct r600_bytecode_alu alu;
1309cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1310cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1311cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1312cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].chan = 3;
1313c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1314cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1315cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.chan = 3;
1316cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.write = 1;
1317cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.last = 1;
1318cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1319cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				return r;
1320cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		}
1321c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	}
1322c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1323725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
1324725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
1325725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
1326725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1327725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1328725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
1329725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1330725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
1331725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
1332725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
1333ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (use_llvm) {
1334ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				continue;
1335ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
1336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
1337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1339be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
1340be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
1341be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
13421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
13437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
13447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
13457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
13467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
13477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
134889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
135089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
135150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
135250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
135350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
1355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1359725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1362eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Get instructions if we are using the LLVM backend. */
1364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		FREE(inst_bytes);
1367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1369457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
1370eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
137154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
137254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
137354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
137454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
137554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
137654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
137754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
137854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
137954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
138054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
138154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
138254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
13835a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		/* reset spi_sid for clipvertex output to avoid confusing spi */
13845a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		shader->output[ctx.cv_output].spi_sid = 0;
13855a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin
138654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
138754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
138854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
138954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
139054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
139154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
139254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
139354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
139454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
139554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
139654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
139754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
139854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
139954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
140054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
140154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
140254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
140354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
140454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
140554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
140654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
140754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
140854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
140954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
141054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
141154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
141254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
141354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
141454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1415543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1416543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1417543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1418543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1419543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1420543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1421543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1422543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1423543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1424543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1425543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
14268ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			if (so.output[i].dst_offset < so.output[i].start_component) {
14278ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
14282449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
14292449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1430543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1431543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1432543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1433543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1434543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
14358ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1436543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1437543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1438543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1439c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1440c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1441c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
14428ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1443543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1444543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1445543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1446543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1447543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1448543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1449543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1450543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1451543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1452543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1453543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1454543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1455543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1456543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1457543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1458543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1459543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1460543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1461543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1462543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1463543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1464543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1465543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1466543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1467543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1468543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1469543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1470543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1474543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1475543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1476543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1477543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1478543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1479543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1480eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
148154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
148254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
148354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
148454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
148554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
148654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
148754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
148854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
148954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
149054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
149154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
149254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1493457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
149591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
149691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
149754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
149854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
149991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
150091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
150191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
150254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
150354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
150454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
150554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
150654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
150791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
150891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
150954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
151054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
151154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
151254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
151354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
151454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
151554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
151654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
151754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
151854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
151954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
152091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
152113daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
152213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
152313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
152413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
152513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
153054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
153154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
15324f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
153354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					for (k = 1; k < shader->nr_cbufs; k++) {
153454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
153554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
153654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
153954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
154054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
154154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_w = 3;
154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
154454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
154554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
154654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1547feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1548feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
15495f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
155054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
155154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
155254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
155539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
155654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
155854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
155954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
156054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
157172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
157254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
157354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
157454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
157554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
157654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1577457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
157854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1579457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
158054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
158154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
158254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
158354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
158454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
158554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
158654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
158754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
158954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
159054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
159154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
159254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1594c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
159554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1596481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
159754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && j == 0) {
159854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
160054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
160254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
160354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
160454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
160554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
160654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
160754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
160854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
160954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
161054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1611481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
161254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
161354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
161454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1615457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1616457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
161789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
16187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
16197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
16207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1621457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1622b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1623b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1624a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1625c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1626c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1627457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1628457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
16294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
163489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
16354a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
16367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1637783e4da72aa203a645737dec81b001341951a942Vadim Girlin	/* check GPR limit - we have 124 = 128 - 4
1638783e4da72aa203a645737dec81b001341951a942Vadim Girlin	 * (4 are reserved as alu clause temporary registers) */
1639783e4da72aa203a645737dec81b001341951a942Vadim Girlin	if (ctx.bc->ngpr > 124) {
1640783e4da72aa203a645737dec81b001341951a942Vadim Girlin		R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1641783e4da72aa203a645737dec81b001341951a942Vadim Girlin		r = -ENOMEM;
1642783e4da72aa203a645737dec81b001341951a942Vadim Girlin		goto out_err;
1643783e4da72aa203a645737dec81b001341951a942Vadim Girlin	}
1644783e4da72aa203a645737dec81b001341951a942Vadim Girlin
16453b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1649cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1656f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1657f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
16664a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1667a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1668a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1669a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1670a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1671a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1672a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1673a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1674a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1675a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1676a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1677a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
16784a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1679f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1680f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1681f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1682f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1683f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
16844a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
16853efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
16863efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
16873efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
16883efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
168980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
169080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
169180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
16924a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
16947a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16957a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
170047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
170147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
17027a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
17037a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
17047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1707dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1709dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1710d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1711d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1712dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1713d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1714d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1715d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1716dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1717dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1718dffad730df17983cfaef0808555a8c26cad0aa15Christian König
17199b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1720dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1721dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17224a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1723dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1724dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1726d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1727d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1728d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
17304a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
173180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17364a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1738d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
17394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
17404a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
17454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
17477a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
17484a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
17497a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1763d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1764d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
17659b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1766d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1767d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1768d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1769d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
17709b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
17719b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
17729b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
17739b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
17749b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
17759b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1776d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1777d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1778cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1779cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1780cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1781cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1782cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1783cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1784cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1785cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1786cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1787cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1788cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1789cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1790cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1791cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1792cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1793cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1794cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1795cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1796cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1797cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1798cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1799cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1800cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1801cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1802cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1803cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1804cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1805cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1806cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1807cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1808cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
18097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
18107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
18117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
18134a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
18147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
18157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
18174a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
18197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18204a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
18217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
18247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
18267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18274a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
18297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
18307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
18317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
18327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
18337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1834d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1835d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{
1836d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1837d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int i, j, k, r;
1838d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct r600_bytecode_alu alu;
1839d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1840d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	for (k = 0; k < last_slot; k++) {
1841d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1842d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			continue;
1843d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
1844d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		for (i = 0 ; i < 4; i++) {
1845d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1846d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.inst = ctx->inst_info->r600_opcode;
1847d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1848d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1849d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			}
1850d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1851d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.dst.write = (i == k);
1852d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (i == 3)
1853d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				alu.last = 1;
1854d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
1855d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (r)
1856d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				return r;
1857d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		}
1858d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	}
1859d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	return 0;
1860d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie}
1861d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
18627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
186388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
186488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
186588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
186688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
18671fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
186888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
186996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
187096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
187196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
187296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
187396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
18744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
18757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
18764a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1877a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
187888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
187988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
188088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
188188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
188288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
188388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
18844a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
18857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1886921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
188788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1888a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
188996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1890ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
189188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
18924a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
189388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
189488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
189588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
18964a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1897a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
18987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
189988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
190088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
190188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
190288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
190388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
190488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
190588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19064a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
190788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
190888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
190988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19104a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1911a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
191288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
191388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
191488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
191588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
191688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
191788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
191888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
191988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
19207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1921921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
192288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1923921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1924ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
192596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
192689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1927a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1928a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
192996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
193096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
193196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
193296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
193396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
193496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
193588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19364a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
193788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
193888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
193992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
194092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
194192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
19427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
19437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
19447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19454a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
19477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
19487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
19507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
19517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
19527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
19554a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
19577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
19587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
19617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
19637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
19647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
19657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
19687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
19697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
19707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
19717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
19727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
197392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
197492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
197592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19764a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
197792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1978dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
197992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
19801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
198192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
198292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
198388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19844a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
198588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
198688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
198788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
198888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
198988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
199088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
199188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
199288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19934a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
199488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
199588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
199688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
199788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1998be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1999be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2000be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
2001be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
20024a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2003a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2004be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
2005be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
200680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2007be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
200888f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
20094a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
201088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
201188f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
201288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
201388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
201488f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
201588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
201692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
201792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
201892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20194a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
202192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
202257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
202357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
202457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
202557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
20261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
202757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
202857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
202957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
203092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
203192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
203257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
203389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
20354a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
20377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
20407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
20427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
20437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
20457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20474a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20524a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
20547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
205592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
20577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
20587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20594a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
20607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
20617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
20627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
206357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
206492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
206592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
206657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
206789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
20694a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
20717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
20737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
20757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
20767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
20787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20804a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20854a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
20877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
208857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
20897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
20917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20924a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
20937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
20957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
209657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
209792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2098ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
2099ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
21004a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2101ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2102ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2103ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
210480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2105ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2106ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
2107ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2108ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2109ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2110ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21114a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2112ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2113ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2114ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2115ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2116ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
2117ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
21184a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2119ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2120ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2121ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
212280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2123ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2124ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2125ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2126ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2127ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2128ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2130ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2131ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2132ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2133ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
213492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
213592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
213692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2137094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
2138094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
21394a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2140094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
2141094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
2142094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
21434a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2144094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
21454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2146094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
21474502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2148921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
21494502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
21504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
21514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
21524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
21534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
21544a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
21554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
2156094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
2157094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
2158094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
21594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2160094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
2161094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
2162094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
21634502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
21644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
21654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
21664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
2167094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
2168094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
2169094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
21700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
21710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
21720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21734a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
21740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
21750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
2176f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
21774a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2178f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
21794a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2180f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2181f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
2182f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2183f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
2184f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
2185f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
2186f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2187f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
21884a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2189f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
2190f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
2191f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
21920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
21930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
21946a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
21956a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
21967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
21976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
219889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
2200f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
22014a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2203f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
2204f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
2205f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
2206f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
22077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
22087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
22117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
22127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22134a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
2218f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
22194a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2221f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
2222f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
22232fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
22242fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
22252fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
22267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22274a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
22326a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
22336a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
22340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
223586f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
22364a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2237a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
223886f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
223986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
22404a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
22414a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
22420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
22430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
22440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
22450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
22460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
22474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
22480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
22490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
22500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
225189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
22537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
22544a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
22577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
22587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
22597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
22607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
22637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
22644a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
22697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
22704a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
22737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
22747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
2281abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
22828567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
22834a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22848567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
22858567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
22868567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
22878567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
22888567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
22894a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
22908567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
22918567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
22928567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
2293abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
22944a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2295abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
22964a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2297abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2298abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
2299abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2300abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
23014a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2302abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2303abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2304abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
2305abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
23064a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2307abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2308abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
2309abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
2310abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2311abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
2312abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
23134a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2314abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2315abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2316abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
23180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
23190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
232042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
232142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
232242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23234a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
232442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
232542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
23264a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2327df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2328370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
2329df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2330df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
2331df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2332df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
2333df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
233442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
23354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
23364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
233742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
233842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
233942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
234042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
23414a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
234242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
234342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
234442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
234542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
234642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
234742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
2348a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
23497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
23507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23514a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2352a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
23537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
23547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
23554a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2357a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
23587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
235980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
23617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
23627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
23634a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
23657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
23667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
23677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
23687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
23697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
2370a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2371a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
2372a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23734a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2374a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
2375a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
23764a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2377a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
2378a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
23794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2380a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
2381a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2382a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2383a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
23844a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2385a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2386a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2387a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
2388a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2389a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2390a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
23917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
23927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
23937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
23954a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
23967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
23977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
23987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
23994a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
24027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
24037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
24047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
24057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
24067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24074a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
24134a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24154a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
24167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
24177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
24187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
24197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
24204a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
24217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
24227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
24237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
24257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
24264a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
24297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
24337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
24397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
24407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
24434a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
24474a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2448a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24494a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24534a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2454a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2455a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2456a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
24574a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
245866f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24594a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24644a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
24684a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2470a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2471a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2472a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2473a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24744a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2476a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2481332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2482332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2483332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
248429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int i, r, j;
2485332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2486332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2487332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
24884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
248929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int tmp3 = r600_get_temp(ctx);
24904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
24914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
24934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
24944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
24954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
24964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
24974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
24984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
24994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
25004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
25014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
25024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
25034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
25044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
25054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
25074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
25084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
25094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
25114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
25134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
25144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
25164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
25184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
25194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
25214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
25234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
25254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
25264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
25284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
25294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
25314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
25334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
25344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2535332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2536332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2537332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2538332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2539332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2541332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2545332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2549332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2551332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2553332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2559332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2561332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2564332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2565332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2567332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2569332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
25844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2587332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2588332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
25944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
26004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
26044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2609332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
26104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
26184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2629332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2630332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
263229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
263329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp3.x = u2f(src2) */
263429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
263529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2636332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
263729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
263829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
263929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
264029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
264129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
264229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
264329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
264429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
264529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
264629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
264729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
264829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
264929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
265029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
265129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
265229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp0.x = recip(tmp3.x) */
265329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 3; j++) {
265429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
265529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
265629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
265729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
265829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
265929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 0);
266029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
266129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp3;
266229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
266329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
266429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (j == 2)
266529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.last = 1;
266629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
266729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
266829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
266929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
267029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
267129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
267229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
267329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
267429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
267529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
267629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
267729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].value = 0x4f800000;
267829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
267929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
268029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
268129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
268229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
268329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (r)
268429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
268529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
268629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
268729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
268829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
268929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
269029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
269129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
269229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
269329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp3;
269429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
269529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
269629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
26994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
270129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
27034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
27194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2725332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
2729332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
273429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
273529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
273629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
27434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2746332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
274829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
274929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
275229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
276329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
27644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
27664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
27684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
27704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
27714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
27724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
27744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
27754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
27764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
27784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
27794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
27804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
278429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
278529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
27864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
278929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
27904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
279229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
27934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
279429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
279529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
280329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
28044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
280629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2807332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
280829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
281129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
281229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
281329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
281429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
281529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
281629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
281729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
281829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
281929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
282029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
282129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
282229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
282329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
282429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
282529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
2826332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
28284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2831332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
28344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
28384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
28404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
28414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
28424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
285029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
285129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2852332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
285329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
285529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 3);
28564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
285829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 2;
28594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
28624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
286429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
286729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		} else {
286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
286929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
287029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
287129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
287229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 3;
287329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
287429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
287529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
287629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 2;
287729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
287829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
287929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 0;
288029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
288129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
288229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
288329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
288429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
28854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2889332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2890332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
28914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2892332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2893332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
28964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
28984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2899332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2901332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2902332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2904332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2906332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2907332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2909332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2910332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2915332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2916332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2918332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2919332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
29214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
29234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2924332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
29264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
29274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
29284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
29314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
29324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
29334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
29344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
29354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
29374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
29394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
294129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
294229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
294329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
294429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
29454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
294629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
294729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
294829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
29494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
295029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
295129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
295329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
295429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
295529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 0;
295629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
295729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
295829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
295929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
296029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
296129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
296229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
296329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
29644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
296529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
296629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
29674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
296829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
296929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
297029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
297129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
297229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
297329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
297429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
297529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
297629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
297729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
297829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
297929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
298029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
298129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
298229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
298329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
298429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
298529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
29864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
298829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
298929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
299029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
299129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
29924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
299329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
299429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
299529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
29964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
299729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
299829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].sel = tmp2;
299929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].chan = 1;
300029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
300129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
300229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
300329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
300429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
300529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 2;
300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
300729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
300929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
301029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
301229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
301329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
301629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
301729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
30184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
302429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
302729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 2;
302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
302929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
303029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
303229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
30354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
30374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
30394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
30404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
30414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
30444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
30454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
30474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
30484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
30504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
30514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
30554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
30574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3059332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3060332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
30614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
3062332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
3063332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
30654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
30664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
30684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
30694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
30714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3072332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
3076332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
30784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
30804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
30824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
30844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
30864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
30874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
30884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
30894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
30904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
30914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
30934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
30944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3097332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3098332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
3100332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
3102332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3104332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3105332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
3107332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
3108332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
3111332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
31244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
31474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
31564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
31574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
31634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
31724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
31734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3176332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3178332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
3179332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3187332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
3199332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
3202332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3206332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
32194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
32254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
32284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3230332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3231332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
32364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
3237332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3240332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3241332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
32514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
32554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
32794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
32834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
32894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
32904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
32954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
33024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
3321332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
3322332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
3323332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3344a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3345a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
3346a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{
3347a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3348a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct r600_bytecode_alu alu;
3349a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int i, r;
3350a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3351a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
3352a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3353a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3354a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3355a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3356a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3357a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3358a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
3359a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3360a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.sel = ctx->temp_reg;
3361a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.chan = i;
3362a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.write = 1;
3363a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3364a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3365a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (i == last_inst)
3366a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3367a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3368a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3369a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3370a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3371a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3372a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3373a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3374a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3375a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3376a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3377a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = ctx->inst_info->r600_opcode;
3378a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3379a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3380a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3381a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].sel = ctx->temp_reg;
3382a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].chan = i;
3383a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3384a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (i == last_inst)
3385a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3386a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3387a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3388a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3389a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3390a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3391a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	return 0;
3392a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin}
3393a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
33946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
33956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
33966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
33976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
33986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
33996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
34006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
34016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
34036b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34046b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34056b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34076b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
34096b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34106b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
34116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
34126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34136b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34146b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34156b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
34166b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34176b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34186b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34196b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34206b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34216b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34226b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34236b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34246b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
34256b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34266b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34276b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34286b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34296b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34306b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
34316b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
34326b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34336b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34346b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
34356b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34366b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
34376b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34386b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
34396b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
34406b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34416b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34426b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34436b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34446b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34456b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
34486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
34496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
345042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
345142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
345242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
345342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
345442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
345542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
345642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
345742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
345842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
345942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
346042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
346142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
346242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
346342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
346442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
346542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
346642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
346742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
346842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
346942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
347042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
347142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
347242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
347342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
347442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
347542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
347642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
347742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
347842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
347942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
348042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
348142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
348242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
348342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
348442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
348542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
348642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
348742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
348842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
348942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
349042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
349142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
349242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
349342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
349442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
349542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
349642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
349742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
349842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
349942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
350042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
350142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
350242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
350342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
350442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
350542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
350642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
350742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
350842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
350942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
351042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
35116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35130d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
35140d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
35150d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3517921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
35180d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
35200d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35214a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3522a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35230d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
3524cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
35250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
3526cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
35270d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3529921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
35304a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
35310d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
35330d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
35344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
35350d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
35360d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
35370d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
35380d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35390d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
35400d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35414a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3542a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35430d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
354480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
35450d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35460d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3547cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
35480d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
35490d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3550921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
35510d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
35520d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35530d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
3554cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
35550d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35560d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
35570d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
35584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
35590d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
35600d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
35610d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
35620d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
35630d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
35640d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3565cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3566cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
35674a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3568cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
3569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
35714a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3572cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3573a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
35746c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
3575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
3576a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
357780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3578cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
3579cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
3580cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3581cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
3582cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
3583cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
35844a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3585cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
3586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
3587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
3588cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
3589cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3590cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
3592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
3593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35944a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
3596dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
35987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
35997be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
36007be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
36017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
36024a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36077be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
360880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
3610cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
3611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
36127be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
3613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36154a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
36197be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3620cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
3623cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
3624cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36254a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3626cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
3627cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
36294a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36324a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3634a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
363580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3636cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
3637a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3638cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
3639cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
3640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
3641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
3642921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3648921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3652e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3653e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3654e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3655e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3656e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3657e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3658e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3660cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
36697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
36726415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
36736415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
36746415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
36756415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36766415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3677192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3678192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
36796415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
36806415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
36816415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
36826415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
36836415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
36846415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
36856415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36866415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
36876415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
36886415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
368933241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
369033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
369196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
369233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36934a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
36944a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3695641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
369640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3697bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3698da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3699da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
37006415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
370178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
370213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
370378293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3704641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37056415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3706641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37071d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
37081d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
37091d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
37101d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
37111d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
37121d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
37131d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
37141d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
37151d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
37161d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
371713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
371813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
371913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
372040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
372140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
37224a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
372340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
372440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
372540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
372640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
372740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
372840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
372940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
373040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
373140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
373240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
373340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
373440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
373540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
37364a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
373740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
37384a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
373940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
374040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
374140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
374240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
374340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
37444a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
374540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
374640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
374740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
374813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
374940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
375040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
375140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
375240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
375340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
375440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
375540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
375640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
375740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
375840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
375940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
376040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
376140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
376240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
376340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
376440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
37654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
376640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
376740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
376813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
376913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3771b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
377289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
37754a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
37774a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
37837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
37854a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
37877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
37887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
37897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
37924a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
37944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
37987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
37997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
38049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3805b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
38064a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3807a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3808b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
38104a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3811b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3812b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3813b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
38144a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3815b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3816b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3817b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
38184a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3819a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3820921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3821b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3822b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3823b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3824b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3825b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
38264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3827b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3828b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
382978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3830b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38339783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
38349783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
3835261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ) {
3836261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
38370e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
38380e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
38424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3843a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
38444a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
38454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
38514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
385789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38594a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38704a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38754a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
38797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
38887ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
38917ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
38934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3904a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39144a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3915a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3924bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3925a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3926bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
39324a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3934bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
39359783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
39369783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
39379783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39389783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
39399783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
39409783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
39419783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
39429783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
39439783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
39449783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
39459783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
39469783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
39479783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
394878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
3950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
395278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
3953b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
39544a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3955a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
39564a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3957b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3958b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3959b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
3960b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
3961b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
39624a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3963b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3964b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3965b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
396678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3967b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3968b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
39697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
3971929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3972929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
39736b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
39749783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
3975929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
3976929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
3977de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
3978de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
3979de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
3980de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3981de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
3982de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
3983de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3984c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
3985c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
3986c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
3987de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
3988de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
3989de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3990de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
3991de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
399233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
39934a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
3994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
39956415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
39966415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
3997077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
3998641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
39996c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
40009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
40019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
40029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
40039d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
400478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
400578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
400678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
400778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
400878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
400978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
401078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
401178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
401278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
401378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
4014244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
401578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
40169a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
4017bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
4018bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
4019bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
4020bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
4021bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
4022bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
40239783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
40249783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
40259783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
40269783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
40279783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_w = 2; /* route Z compare value into W */
40289783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
4029bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40306b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
40316b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
403201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
403301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
403401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
40356b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
40366b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
4037bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40381d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
40391d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
40401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
404169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
4042929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
4043929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
4044929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
4045929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4046929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
40476b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
4048929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
4049929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
4050929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
405178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
4052929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
4053929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
4054929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
4055929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
4056929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
4057929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
4058929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
4059929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
4060929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
4061929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
4062929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
4063929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
4064929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
4065929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
4066929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
4067929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
4068929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
4069bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
40704a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
4071bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
4072bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
4073bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
4074bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
4075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
407633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
407733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
4078b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
4079b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
4080b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
40814a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4082dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
4084b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
4085b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4086c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
40871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
4088c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
4089c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4090c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
4091c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
40924a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4093c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
40944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
40954a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4096c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
409780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4098c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
4099c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
4100c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
4101c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
41024a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4103c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
4104c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
4105c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
4106c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
4107c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
4108c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
4109b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
4110dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4111dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4112dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4113dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41144a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4115a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4116921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
4117b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
41184a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
41194a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
4120b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4121b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4122dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4123b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4125b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
41264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4127b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4131b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
4132dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4133dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4134dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4135dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41364a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4137a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
4139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
41404a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4143dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
41474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4149b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4150b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4152b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
4153dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4154dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4155dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4156dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4158a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4159b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
41604a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
41614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4162b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
4163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
4164dffad730df17983cfaef0808555a8c26cad0aa15Christian König
416580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4167dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4169b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
41704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4171b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4173b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4174dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
4175b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
4176b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
417787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
417887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
417987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41804a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
418187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
4182dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
418387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
41847be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
41857be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
41867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
418787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
41884a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4189a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
41904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
41914a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
41924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
419380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
419487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
419587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
419687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
41977be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
419887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
41994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
420087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
420187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
42027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
420387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
420487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
420587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
42070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
42080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
42100e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
42114a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
42120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
42130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
42140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
42160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
42170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
42194a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4220a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
42210e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
42224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
42234a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
42240e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
42250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
42260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
42270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
42280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
42290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
42300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
42320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
42330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
42340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
42360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
42374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
42380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
42390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
42400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
42410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
42434a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4244a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
42450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42460e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
42474a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
42484a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
42490e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
42500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
42510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
42520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
42530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
42540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
42550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
42570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
42580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
42590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
42600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
42610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
426280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
426380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
42640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
42650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
42660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
42670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
42680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
42694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
42700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
42710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
42720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
42730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
42740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
42750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
42760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
42770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
427836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
427936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
428036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42814a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
428209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
42837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
428436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
428536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
428636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
42874a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
428836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4289a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
42904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
429136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
429236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
429336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
429436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
429536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
42964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
429736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
429836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
429936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
430089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
43047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
430536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
43087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
43097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
43107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
43117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
43124a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
43167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
43177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
43197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
43207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
43227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
43237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
43247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
43254a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
43267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
43277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
43287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
432936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
43307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
433136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
433236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
43334a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
433436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4335a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
43364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
433736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
433836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
4339b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
4340b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4341b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
4342b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
4343b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
434436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
434536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
434636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
434736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
434836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
435036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
435136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
435236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
435336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
435436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
435536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
435689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43584a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
43597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43604a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
436136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
43647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
43657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
43667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
43677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
436836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43694a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
43737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
43744a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
43757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
437736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
43797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
43807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
43817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
43837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
43844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
43857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
43867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
43877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
438836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
438936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
439036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
439136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
43924a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
439336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4394a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
439536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
439636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
439736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
439836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
439936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
440036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
440136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
44024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
440336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
440436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
440536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
440636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
440736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
440887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
4409460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
4410460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
4411460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
44124a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4413460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
44147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
4415460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4416f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
4417460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
441889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44204a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4421460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44234a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44244a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
44257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
44297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
44317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44324a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
4436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44384a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44414a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44424a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
44437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
44467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44484a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
4455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
4459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
44624a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4467f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
447089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44724a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
447396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44754a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44764a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
447796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
44787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
44817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
44837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44854a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
44897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44904a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
44934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
44944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
44957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
44987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45014a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
450596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45064a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
450796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
450896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
450996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
451096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
451196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
451296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
451396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
451496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
451596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
451696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45174a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
451896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
451996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
452096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
452189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45234a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
45257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
45267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
45277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
453496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45354a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45404a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
45427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
45437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
454496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
45477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
454996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45504a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
455496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
455589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45574a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
45597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
45607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
45617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
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			}
45737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45744a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
45767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
45777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
457896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
45817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
458396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
458896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45894a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
459096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
459196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
459296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
459596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
459696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
459796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
4598460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4599460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4600460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
4601460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4602460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4603460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4605460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4606460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4607460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4609f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
4610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
461189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46134a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46164a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46174a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
4618460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
4625460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46264a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46314a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46344a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
46367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
46407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
46417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46424a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4646460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4647460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4648460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4649460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
46504a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4651460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4652460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4653460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4654460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4662460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4663460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4664460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4665460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4666460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4667460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4668460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
466998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
467098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
467198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
46724a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
467398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4674a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
46754a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
467698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
467752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
467852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
467952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
468052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
468152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
468252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
468352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
46849b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
46858e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
46869b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
468752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
468852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
468952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
469052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
469152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
46928e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
469398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
46948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
46958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
46964a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
469798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
469898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
46998e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
47008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
470198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
470298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
470398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
470447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
470547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47064a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
470747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4708a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
47107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4711077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4712077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
47134a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47148e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4715077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4716077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4717077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47184a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4719077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4720077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4721077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4722077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
47238e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
47248e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4725077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4726077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4727077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47284a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4729077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
47307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
47317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4732077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4733077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
47344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47358e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4736077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4737077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4738077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
47394a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4740077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
47417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
47429b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
47438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
47448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
47458e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47468e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
47478e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
47488e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
47498e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
47508e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
47518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
47529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
47537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
47547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
47557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
47567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
47577ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
47588e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
475947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
476047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
476147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
476257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
476357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
476457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
476657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
476757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
476857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
47694a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
477057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4771a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
477280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
47737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
47747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
477557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
477657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
47774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
477857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
477957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4780a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
478157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
478257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
47834a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
478457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
478557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
478657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
47874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
478857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
478957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
479057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
479157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
479257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
479357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4794a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4795a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
47964a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
47994a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
4802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48074a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4808a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
48107ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48134a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4815a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4818a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4819a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4820a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48212bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
48222bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
48232bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
48242bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
48252bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
48264f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
48272bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
48284f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
48292bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
48302bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
48312bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
48322bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
48334f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
48342bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
48352bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
48364f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
48372bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
48382bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
48392bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
48402bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
48412bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
48422bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
48432bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
48444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
48458813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
48468813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
48478813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
48482bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4849a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4850a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4851a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
485209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4853a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
485409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
485509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
485609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
485709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
485809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
485909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
486009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
486109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
486209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
486309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
486409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
486509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
486609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
486709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4868a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
486909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
487009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
487109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
487209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
487309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
487409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
487509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
487609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
487709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
487809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
487909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4880a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4881a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4882a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
488309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
488409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
488509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
488609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
488709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
488809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
488909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
48907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
489109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
489209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
489309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
489409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
489509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
489609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
489709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
489809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
489909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
490009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
490109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
490209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
490309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
490409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
490509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
490609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
490709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
490809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
490909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
491009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
491109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
491209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
491309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
491409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49154a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
49164a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
491709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
491809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
491909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4920a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
492109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
492209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4923a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
492409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
492509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
492609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
492709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
492809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
492909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
493009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
493109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
493209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
493309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
493409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
493509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
493709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
493809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
493909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
494009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
49444f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
494809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49514f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
495209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
4953370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX work out offset */
495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4956a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
495909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
49647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
496509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
496609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
497309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
497409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
497809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
498109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
49918b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49934a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
499609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
4998a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4999a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5000a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5001a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
5002a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
50034a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
5004a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
5005a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
5007a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
5008a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5009a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5010a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5011a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
5012a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
5013a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
5014a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
5015a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
5016a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
5017a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
5018a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5019a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
5020a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5021a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
5022a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
502309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
5024a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
502509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
502809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50334a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
503409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
5036a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
503709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
503809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
504009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
504109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
504309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
504409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
504509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50464a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
504709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
504909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
505009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
505109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
505209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
505309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
505409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
505509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
505609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
505709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
505809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
505909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
506009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
506109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
506209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
506309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
506409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
5065370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX add LOOPRET support */
506609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
506709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
506809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
506909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
507009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
507109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
507209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
507309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
507409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
507509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
507609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
507709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
507809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
507909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
508009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
508109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
508209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
508309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
508409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
508509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50864a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
508709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
508809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
508909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
509009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5091a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5092a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5093a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5094cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
5095cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
5096cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5097cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
5098cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
5099cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
5100cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5101cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
5102cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5103cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5104cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5105cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5106cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5107cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5108cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
5109cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
5110cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
5111cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5112c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
5113cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
5114cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5115cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5116cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
51179b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
5118cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5119cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5120cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5121cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5122cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5123cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5124cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5125cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5126cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5127cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5128cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5129cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5130cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5131c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5132cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5133cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
5134cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
5135cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5136cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5137cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
5138cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
5139cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5140cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5141cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5142cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5143cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5144cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
5145cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
5146cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
514898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
51500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5151df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
5152370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
5153df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
5154df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
5155df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
5156df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
5157df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
515842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
515936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5160460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5163cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5164cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
516557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5166dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5168d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5169be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51803af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51823af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5183df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
51847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
51854558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5186a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
51870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51907a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5192e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
519388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
51943af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
51953af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
51964502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52020d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52040d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
520588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5206d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
52070d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5209b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
521013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5211b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52189f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52220d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
522387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
522492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5225c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5228cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5229ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
523009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5231a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5235a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5236a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52428c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5243c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5244cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
52450ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5246d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
5247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5249c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5250c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
52514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5252cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52541d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
52551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
525609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
525909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
526109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5278094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5282bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
5283332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5284c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5285c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
52865893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5287c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5288d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
52890196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5290c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
52919a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5292c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
52934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5294c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5295c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5296c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
52974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5298850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5299c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5300c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5301d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
53027383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5303c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
5304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5308cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5309a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,  0, 0, tgsi_unsupported},
5310a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
5311cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5312cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5313cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5314cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5315cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5316cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5317a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5318cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5319cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
53209b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
53219b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
53226b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
532342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
532650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
532750526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
532898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
532950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
533050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
533150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
53328ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
533350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5334112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
533550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
533650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
533750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
533850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
533950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
534050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
534150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
534250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
534350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
534450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
534550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
534650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
534750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
534850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
534950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
535050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
535150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
535250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
535350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
535450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
535550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
535650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5357df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
535850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
535950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
536050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
536150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
536250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
536350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
536450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
536550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
536650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
536750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
536850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
536950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
537050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
537150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
537250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
537350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
537450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
537550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
537650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
537750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
537850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
537950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
538050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
538150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
538250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
538350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
538413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
538550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
538650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
53937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
53977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
53987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5399c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
54007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
54047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
54057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
54067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
54107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
54117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54168c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5417608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5418cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
54197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5420d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
54217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5423cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5424cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
54254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5426cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
54277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54281d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
54291d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
54307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
54317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
54347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
54367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
54537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
54547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5456a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
5457332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5459cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5460cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5462d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5463cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5464a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
5465b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
54674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5468cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5470cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
54714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
54729b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5473cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5474cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5475d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
54767383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5477cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
54787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5482cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5483a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5484a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5485cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5486cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5487cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5488cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5489cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5490cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5491a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5492cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5493cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
54949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
54959b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
54966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
549742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
54987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
55007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
55017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
55027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
55037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
55057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
55067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
55077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
55087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
55097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
55107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
55147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
55157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
55167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
55177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
55187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
55197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
55217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
55297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5531df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
55327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
55337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
55347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
55357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
55367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
55427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
55437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
55447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
55457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
55517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
55537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
55547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
55557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
55567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
555813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
55597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
55607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
556750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
556950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
557050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
557150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
557250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5573c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
557450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
557550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
557650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5577ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
557850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
557950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
558050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
558150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
558250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
558350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
558450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
558550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
558650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
558750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
558850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
558950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55908c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5591f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5592cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
55930ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5594f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
559550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
559650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5597f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5598f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
559929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5600cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
560150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56021d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
56031d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
560450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
560550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
560850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
560950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
561050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
561250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
561850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
561950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
562650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
562750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
562850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
562950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5630f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
563129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5632cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5633cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5634f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5635f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5636f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5637f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5638f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5639f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5640f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
564129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5642f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5643f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5644f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
564529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5646d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5647f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5648f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5649f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5650f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5651f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
565250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5656cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5657a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5658a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5659cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5660cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5661cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5662cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5663cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5664cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5665a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5666cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5667cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5668f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
56699b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5670f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5671f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
567250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5674