172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/*
272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"),
672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation
772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next
1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software.
1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */
23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
24ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "r600_llvm.h"
25077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h"
26a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h"
2772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
28330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák
29ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "pipe/p_shader_tokens.h"
30330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_info.h"
31330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_parse.h"
32330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_scan.h"
33330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_dump.h"
34ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include "util/u_memory.h"
35ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#include <stdio.h>
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
37843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano#include <byteswap.h>
38843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano
397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie/* CAYMAN notes
407779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieWhy CAYMAN got loops for lots of instructions is explained here.
417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie-These 8xx t-slot only ops are implemented in all vector slots.
437779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT
447779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops, with all four
457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieslots expecting the arguments on sources a and b. Result is
467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliebroadcast to all channels.
477779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT
487779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops in the z, y, and
497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliex slots.
507779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64
517779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64
527779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSQRT_IEEE/_64
537779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSIN/COS
547779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe w slot may have an independent co-issued operation, or if the
557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieresult is required to be in the w slot, the opcode above may be
567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieissued in the w slot as well.
577779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe compiler must issue the source argument to slots z, y, and x
587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie*/
597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
60a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
611235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
62e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
64843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	uint32_t *ptr;
65843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	int	i;
661235becaa1cf7e29f580900592563c3329d326deJerome Glisse
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
696101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		shader->bo = (struct r600_resource*)
706101b6d442b06a347c001fe85848d636ab7df260Marek Olšák			pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4);
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
731235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
740a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák		ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
75d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		if (R600_BIG_ENDIAN) {
76d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			for (i = 0; i < rshader->bc.ndw; ++i) {
77d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
78d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			}
79d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		} else {
80d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
81843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		}
820a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák		rctx->ws->buffer_unmap(shader->bo->cs_buf);
831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
841235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
851235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
874f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
881235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
891235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
901235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
911235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
921235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
931235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
944f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
951235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
961235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
971235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
991235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse
106e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader);
1073b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
108eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
110052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
111e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1124acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_pipe_shader_selector *sel = shader->selector;
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse
115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
118c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
121052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
1224acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		tgsi_dump(sel->tokens, 0);
123543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1244acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		if (sel->so.num_outputs) {
125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			unsigned i;
126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			fprintf(stderr, "STREAMOUT\n");
1274acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			for (i = 0; i < sel->so.num_outputs; i++) {
1284acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin				unsigned mask = ((1 << sel->so.output[i].num_components) - 1) <<
1294acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin						sel->so.output[i].start_component;
130543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				fprintf(stderr, "  %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i,
1314acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin					sel->so.output[i].output_buffer, sel->so.output[i].register_index,
1322449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        mask & 1 ? "x" : "_",
1332449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 1) & 1 ? "y" : "_",
1342449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 2) & 1 ? "z" : "_",
1352449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 3) & 1 ? "w" : "_");
136543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
137543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
138052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
139eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	r = r600_shader_from_tgsi(rctx, shader);
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_build(&shader->shader.bc);
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
149052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
1504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_dump(&shader->shader.bc);
151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
152052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
153afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15669251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
157ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
1586101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
1594a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_clear(&shader->shader.bc);
160ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1652b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
167a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
18478293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	struct r600_bytecode			*bc;
1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
18640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
18778293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				*literals;
18878293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				nliterals;
18978293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				max_driver_temp_used;
190fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
195725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					face_gpr;
196725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					colors_used;
19754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	boolean                 clip_vertex_write;
19854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	unsigned                cv_output;
199c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	int					fragcoord_input;
200951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin	int					native_integers;
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
21142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
212ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only);
213ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type);
214ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_else(struct r600_shader_ctx *ctx);
215ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endif(struct r600_shader_ctx *ctx);
216ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_bgnloop(struct r600_shader_ctx *ctx);
217ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_endloop(struct r600_shader_ctx *ctx);
218ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx);
219ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
220ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/*
221ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * bytestream -> r600 shader
222ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard *
223ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * These functions are used to transform the output of the LLVM backend into
224ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard * struct r600_bytecode.
225ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard */
226ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
2276a829a1b724ca0d960decee217d260b4de8a5463Adam Rakstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
2286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak				unsigned char * bytes,	unsigned num_bytes);
2296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#ifdef HAVE_OPENCL
2316a829a1b724ca0d960decee217d260b4de8a5463Adam Rakint r600_compute_shader_create(struct pipe_context * ctx,
2326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	LLVMModuleRef mod,  struct r600_bytecode * bytecode)
2336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak{
2346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_context *r600_ctx = (struct r600_context *)ctx;
2356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned char * bytes;
2366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned byte_count;
2376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	struct r600_shader_ctx shader_ctx;
2386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	unsigned dump = 0;
2396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
2416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		dump = 1;
2426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_llvm_compile(mod, &bytes, &byte_count, r600_ctx->family , dump);
2456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader_ctx.bc = bytecode;
2466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_bytecode_init(shader_ctx.bc, r600_ctx->chip_class, r600_ctx->family);
2476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	shader_ctx.bc->type = TGSI_PROCESSOR_COMPUTE;
2486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_bytecode_from_byte_stream(&shader_ctx, bytes, byte_count);
2490c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	if (shader_ctx.bc->chip_class == CAYMAN) {
2500c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard		cm_bytecode_add_cf_end(shader_ctx.bc);
2510c4b19ac63efa41242c515824301e6161aceeea5Tom Stellard	}
2526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	r600_bytecode_build(shader_ctx.bc);
2536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	if (dump) {
2546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak		r600_bytecode_dump(shader_ctx.bc);
2556a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	}
2566a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	return 1;
2576a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}
2586a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2596a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif /* HAVE_OPENCL */
2606a829a1b724ca0d960decee217d260b4de8a5463Adam Rak
2612c485cda2062ca2b9af89ea62618515d960c7904Tom Stellardstatic uint32_t i32_from_byte_stream(unsigned char * bytes,
2622c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard		unsigned * bytes_read)
2632c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard{
2642c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	unsigned i;
2652c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t out = 0;
2662c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	for (i = 0; i < 4; i++) {
2672c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard		out |= bytes[(*bytes_read)++] << (8 * i);
2682c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	}
2692c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	return out;
2702c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard}
2712c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_src_from_byte_stream(unsigned char * bytes,
273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned bytes_read, struct r600_bytecode_alu * alu, unsigned src_idx)
274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned i;
276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned sel0, sel1;
277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel0 = bytes[bytes_read++];
278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	sel1 = bytes[bytes_read++];
279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].sel = sel0 | (sel1 << 8);
280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].chan = bytes[bytes_read++];
281ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].neg = bytes[bytes_read++];
282ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].abs = bytes[bytes_read++];
283ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].rel = bytes[bytes_read++];
284ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu->src[src_idx].kc_bank = bytes[bytes_read++];
285ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for (i = 0; i < 4; i++) {
286ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		alu->src[src_idx].value |= bytes[bytes_read++] << (i * 8);
287ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
288ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
289ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
290ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
291ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx,
292ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
293ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
294ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned src_idx;
295ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst0, inst1;
2968f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	unsigned push_modifier;
297ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
298ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
299ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	for(src_idx = 0; src_idx < 3; src_idx++) {
300ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		bytes_read = r600_src_from_byte_stream(bytes, bytes_read,
301ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								&alu, src_idx);
302ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
303ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
304ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.sel = bytes[bytes_read++];
305ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.chan = bytes[bytes_read++];
306ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.clamp = bytes[bytes_read++];
307ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.write = bytes[bytes_read++];
308ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.dst.rel = bytes[bytes_read++];
309ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst0 = bytes[bytes_read++];
310ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst1 = bytes[bytes_read++];
311ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.inst = inst0 | (inst1 << 8);
312ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.last = bytes[bytes_read++];
313ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.is_op3 = bytes[bytes_read++];
3148f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	push_modifier = bytes[bytes_read++];
315da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.pred_sel = bytes[bytes_read++];
316ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle = bytes[bytes_read++];
317ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.bank_swizzle_force = bytes[bytes_read++];
318ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.omod = bytes[bytes_read++];
319ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	alu.index_mode = bytes[bytes_read++];
3208f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
3218f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
3228f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE) ||
3238f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE) ||
3248f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT) ||
3258f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	    alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)) {
3268f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.update_pred = 1;
3278f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.dst.write = 0;
3288f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.src[1].sel = V_SQ_ALU_SRC_0;
3298f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.src[1].chan = 0;
3308f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.last = 1;
3318f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune    }
3328f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
3338f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune    if (push_modifier) {
3348f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune        alu.pred_sel = 0;
3358f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		alu.execute_mask = 1;
3368f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
3378f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune	} else
3388f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune		r600_bytecode_add_alu(ctx->bc, &alu);
3398f597d57e959830040473b548e0e04cfc63866c2Vincent Lejeune
340ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
341ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* XXX: Handle other KILL instructions */
342ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (alu.inst == CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT)) {
343ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->shader->uses_kill = 1;
344ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		/* XXX: This should be enforced in the LLVM backend. */
345ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->bc->force_add_cf = 1;
346ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
347ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
348ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
349ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
350ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu,
351ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned pred_inst)
352ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
353ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
354ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	fc_pushlevel(ctx, FC_IF);
355ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
356ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
357ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
358ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_break_from_byte_stream(struct r600_shader_ctx *ctx,
359ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			struct r600_bytecode_alu *alu, unsigned compare_opcode)
360ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
361ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned opcode = TGSI_OPCODE_BRK;
362ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (ctx->bc->chip_class == CAYMAN)
363ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &cm_shader_tgsi_instruction[opcode];
364ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else if (ctx->bc->chip_class >= EVERGREEN)
365ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &eg_shader_tgsi_instruction[opcode];
366ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	else
367ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx->inst_info = &r600_shader_tgsi_instruction[opcode];
368ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	llvm_if(ctx, alu, compare_opcode);
369ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_loop_brk_cont(ctx);
370ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tgsi_endif(ctx);
371ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
372ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
373ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx,
374ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
375ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
376ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_alu alu;
377ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned inst;
378ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	memset(&alu, 0, sizeof(alu));
379ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bytes_read = r600_src_from_byte_stream(bytes, bytes_read, &alu, 0);
380ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	inst = bytes[bytes_read++];
381ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	switch (inst) {
3822fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 0: /* FC_IF */
383ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		llvm_if(ctx, &alu,
384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3862fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 1: /* FC_IF_INT */
387bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		llvm_if(ctx, &alu,
388bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
389ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3902fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 2: /* FC_ELSE */
391bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_else(ctx);
392ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3932fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 3: /* FC_ENDIF */
394bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endif(ctx);
395ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3962fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 4: /* FC_BGNLOOP */
397bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_bgnloop(ctx);
398ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
3992fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 5: /* FC_ENDLOOP */
400bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		tgsi_endloop(ctx);
401ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
4022fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 6: /* FC_BREAK */
403ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_break_from_byte_stream(ctx, &alu,
404bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
405ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
4062fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 7: /* FC_BREAK_NZ_INT */
407bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		r600_break_from_byte_stream(ctx, &alu,
4082fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
409bc4b4c605cc04138e5209782fa5939bfd71930bdVincent Lejeune		break;
4102fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 8: /* FC_CONTINUE */
411ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		{
412ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			unsigned opcode = TGSI_OPCODE_CONT;
413ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (ctx->bc->chip_class == CAYMAN) {
414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&cm_shader_tgsi_instruction[opcode];
416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else if (ctx->bc->chip_class >= EVERGREEN) {
417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&eg_shader_tgsi_instruction[opcode];
419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			} else {
420ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				ctx->inst_info =
421ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					&r600_shader_tgsi_instruction[opcode];
422ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
423ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			tgsi_loop_brk_cont(ctx);
424ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
425ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		break;
4262fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 9: /* FC_BREAK_Z_INT */
42718617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		r600_break_from_byte_stream(ctx, &alu,
42818617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE_INT));
42918617d7423b2c12aac9adbb8354fbf5d0c8ddfeaTom Stellard		break;
4302fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard	case 10: /* FC_BREAK_NZ */
4312fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard		r600_break_from_byte_stream(ctx, &alu,
4322fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard			CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
4332fae8227ad906a6d6290134368b62f5dd3a1858eTom Stellard		break;
434ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
435ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
436ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
437ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
438ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
439ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic unsigned r600_tex_from_byte_stream(struct r600_shader_ctx *ctx,
440ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes, unsigned bytes_read)
441ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
442ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	struct r600_bytecode_tex tex;
443ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
444ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.inst = bytes[bytes_read++];
445ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.resource_id = bytes[bytes_read++];
446ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_gpr = bytes[bytes_read++];
447ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_rel = bytes[bytes_read++];
448ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_gpr = bytes[bytes_read++];
449ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_rel = bytes[bytes_read++];
450ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_x = bytes[bytes_read++];
451ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_y = bytes[bytes_read++];
452ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_z = bytes[bytes_read++];
453ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.dst_sel_w = bytes[bytes_read++];
454ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.lod_bias = bytes[bytes_read++];
455ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_x = bytes[bytes_read++];
456ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_y = bytes[bytes_read++];
457ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_z = bytes[bytes_read++];
458ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.coord_type_w = bytes[bytes_read++];
459ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_x = bytes[bytes_read++];
460ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_y = bytes[bytes_read++];
461ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.offset_z = bytes[bytes_read++];
462ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.sampler_id = bytes[bytes_read++];
463ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_x = bytes[bytes_read++];
464ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_y = bytes[bytes_read++];
465ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_z = bytes[bytes_read++];
466ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	tex.src_sel_w = bytes[bytes_read++];
467ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
468ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	r600_bytecode_add_tex(ctx->bc, &tex);
469ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
470ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	return bytes_read;
471ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
472ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
473e42df8e10a83e76565474f82330d34403da71b49Tom Stellardstatic int r600_vtx_from_byte_stream(struct r600_shader_ctx *ctx,
474e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	unsigned char * bytes, unsigned bytes_read)
475e42df8e10a83e76565474f82330d34403da71b49Tom Stellard{
476e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	struct r600_bytecode_vtx vtx;
4772c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4782c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word0 = i32_from_byte_stream(bytes, &bytes_read);
4792c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard        uint32_t word1 = i32_from_byte_stream(bytes, &bytes_read);
4802c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	uint32_t word2 = i32_from_byte_stream(bytes, &bytes_read);
4812c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
482e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	memset(&vtx, 0, sizeof(vtx));
4832c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4842c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD0 */
4852c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.inst = G_SQ_VTX_WORD0_VTX_INST(word0);
4862c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.fetch_type = G_SQ_VTX_WORD0_FETCH_TYPE(word0);
4872c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.buffer_id = G_SQ_VTX_WORD0_BUFFER_ID(word0);
4882c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_gpr = G_SQ_VTX_WORD0_SRC_GPR(word0);
4892c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.src_sel_x = G_SQ_VTX_WORD0_SRC_SEL_X(word0);
4902c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.mega_fetch_count = G_SQ_VTX_WORD0_MEGA_FETCH_COUNT(word0);
4912c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
4922c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD1 */
4932c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_gpr = G_SQ_VTX_WORD1_GPR_DST_GPR(word1);
4942c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_x = G_SQ_VTX_WORD1_DST_SEL_X(word1);
4952c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_y = G_SQ_VTX_WORD1_DST_SEL_Y(word1);
4962c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_z = G_SQ_VTX_WORD1_DST_SEL_Z(word1);
4972c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.dst_sel_w = G_SQ_VTX_WORD1_DST_SEL_W(word1);
4982c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.use_const_fields = G_SQ_VTX_WORD1_USE_CONST_FIELDS(word1);
4992c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.data_format = G_SQ_VTX_WORD1_DATA_FORMAT(word1);
5002c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.num_format_all = G_SQ_VTX_WORD1_NUM_FORMAT_ALL(word1);
5012c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.format_comp_all = G_SQ_VTX_WORD1_FORMAT_COMP_ALL(word1);
5022c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.srf_mode_all = G_SQ_VTX_WORD1_SRF_MODE_ALL(word1);
5032c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard
5042c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	/* WORD 2*/
5052c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.offset = G_SQ_VTX_WORD2_OFFSET(word2);
5062c485cda2062ca2b9af89ea62618515d960c7904Tom Stellard	vtx.endian = G_SQ_VTX_WORD2_ENDIAN_SWAP(word2);
507e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
508e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	if (r600_bytecode_add_vtx(ctx->bc, &vtx)) {
509e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		fprintf(stderr, "Error adding vtx\n");
510e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	}
511e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	/* Use the Texture Cache */
512e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	ctx->bc->cf_last->inst = EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX;
513e42df8e10a83e76565474f82330d34403da71b49Tom Stellard	return bytes_read;
514e42df8e10a83e76565474f82330d34403da71b49Tom Stellard}
515e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
516ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellardstatic void r600_bytecode_from_byte_stream(struct r600_shader_ctx *ctx,
517ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				unsigned char * bytes,	unsigned num_bytes)
518ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard{
519ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	unsigned bytes_read = 0;
5206f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard	unsigned i, byte;
521ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	while (bytes_read < num_bytes) {
522ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		char inst_type = bytes[bytes_read++];
523ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		switch (inst_type) {
524ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 0:
525ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_alu_from_byte_stream(ctx, bytes,
526ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
527ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
528ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 1:
529ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_tex_from_byte_stream(ctx, bytes,
530ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
531ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
532ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		case 2:
533ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			bytes_read = r600_fc_from_byte_stream(ctx, bytes,
534ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard								bytes_read);
535ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
5366f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard		case 3:
5376f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			r600_bytecode_add_cfinst(ctx->bc, CF_NATIVE);
5386f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			for (i = 0; i < 2; i++) {
5396f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				for (byte = 0 ; byte < 4; byte++) {
5406f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					ctx->bc->cf_last->isa[i] |=
5416f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard					(bytes[bytes_read++] << (byte * 8));
5426f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard				}
5436f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			}
5446f50f939ef85bb058c1401b5dad8340aa4f96aecTom Stellard			break;
545e42df8e10a83e76565474f82330d34403da71b49Tom Stellard
546e42df8e10a83e76565474f82330d34403da71b49Tom Stellard		case 4:
547e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			bytes_read = r600_vtx_from_byte_stream(ctx, bytes,
548e42df8e10a83e76565474f82330d34403da71b49Tom Stellard								bytes_read);
549e42df8e10a83e76565474f82330d34403da71b49Tom Stellard			break;
550ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		default:
551ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			/* XXX: Error here */
552ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			break;
553ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
554ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
555ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard}
556ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
557ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard/* End bytestream -> r600 shader functions*/
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
56772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
571c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
572a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
57672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
577a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
5798260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
5808260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
5818260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
58647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
58747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
59272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
59372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
59550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
59650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
5974a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
601fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
605fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
606fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
607fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
608fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
609fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
610fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
611fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
612fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
613fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
614fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
615fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
616fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
6177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
618fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
619fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
620fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
62150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
62250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
6234a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
62450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
62550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
626738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
62750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
628738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
62950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
63050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
631fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
63250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
63350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
63450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
63550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
636fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
637fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
638fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
639fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
640fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
64150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
64250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
64350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
64450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
6454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
64650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
64750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
64850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
64950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
6507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
6517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
65221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
65321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
65421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
65521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
65621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
65721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
65821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
65921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
660738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
66121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
66221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
66321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
66421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
66521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
66621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
66721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
66821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
66921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
67021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
67121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
67221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
67321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
67421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
67521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
67621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
67721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
6787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
6790a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
6800a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
6810a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6820a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
6830a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
6840a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
6850a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
6860a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6870a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
6880a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
6890a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
6900a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
6910a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
6920a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
6930a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
6940a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
6950a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
6960a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6970a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
6980a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
6990a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
7000a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
7010a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
7020a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
7030a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
7040a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
7050a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
7060a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
7070a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
7080a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
7090a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
7100a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
7115b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7125b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7135b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
7145b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
7155b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
7165b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
7175b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7185b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
7195b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
7205b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
7215b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
7225b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
7235b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
7245b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
7255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
7265b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
7275b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
7285b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
7295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
7305b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
7315b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
7325b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
7335b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7345b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
7355b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
7365b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
7375b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
7385b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
7395b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
7405b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
7415b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
7425b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
743725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
744725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
745725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
746725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
747725a820b926575265e6790601a0defd9c30947dcVadim Girlin
748725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
749725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
750725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
751725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
752725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
753725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
754725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
755725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
756725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
757725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
758725a820b926575265e6790601a0defd9c30947dcVadim Girlin
759725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
760725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
761725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
762725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
763725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
764725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
765725a820b926575265e6790601a0defd9c30947dcVadim Girlin
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
767725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
768725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
770725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
771725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
772725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
773725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
774725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
775725a820b926575265e6790601a0defd9c30947dcVadim Girlin
776725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
777725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
778725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
779725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
780725a820b926575265e6790601a0defd9c30947dcVadim Girlin
781725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
782725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
783725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
784725a820b926575265e6790601a0defd9c30947dcVadim Girlin
785725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
786725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
787725a820b926575265e6790601a0defd9c30947dcVadim Girlin
788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
78972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
79296bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
79372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
7995b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
8001279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].interpolate = d->Interp.Interpolate;
8011279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->input[i].centroid = d->Interp.Centroid;
802024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
803725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
804c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			switch (ctx->shader->input[i].name) {
805c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_FACE:
806725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
807c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
808c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_COLOR:
809725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
810c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
811c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_POSITION:
812c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				ctx->fragcoord_input = i;
813c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
814c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			}
815725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
816c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				if ((r = evergreen_interp_input(ctx, i)))
817725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
818fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
81950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
8255b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
826024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
8271279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez		ctx->shader->output[i].interpolate = d->Interp.Interpolate;
82891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
82991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
83091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
83191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
83291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
83391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
83491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
83591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
836e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák				ctx->shader->vs_out_point_size = 1;
83791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
83854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
83954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
84054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
84154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
84291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
8430c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		} else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
8440c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			switch (d->Semantic.Name) {
8450c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			case TGSI_SEMANTIC_COLOR:
8460c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				ctx->shader->nr_ps_max_color_exports++;
8470c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				break;
8480c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			}
84991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
85333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
85447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
85696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
857c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
858c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
859951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			if (!ctx->native_integers) {
860951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				struct r600_bytecode_alu alu;
861951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
86296bbc627f369c0100b950f81531b1fe9ef586c34Christian König
863951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
864951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].sel = 0;
865951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.src[0].chan = 3;
86696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
867951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.sel = 0;
868951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.chan = 3;
869951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.dst.write = 1;
870951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				alu.last = 1;
87196bbc627f369c0100b950f81531b1fe9ef586c34Christian König
872951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
873951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin					return r;
874951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin			}
875c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
87639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
87739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
88372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
88472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
885be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
886be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
887be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
888be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
889be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
8907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
891fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
892fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
893fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
894fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
895fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
896fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
897fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
898fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
899fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
900fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
901fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
902fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
903fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
904fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
905fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
906fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
907fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
908fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
909fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
910fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
911fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
912fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
913fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
914fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
915fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
916fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
917fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
918fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
919fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
920fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
921fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
922fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
923fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
924fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
925fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
926fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
927fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
928fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
929fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
930fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
931fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
932fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
933370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
934fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
935fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
936fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
9371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
9381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
9401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
9411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
9421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
9431fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
9441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
9451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
9461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
9471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
94896bbc627f369c0100b950f81531b1fe9ef586c34Christian König
9491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
9501fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
9511fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
9521fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
9531fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
9541fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9551fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
9564a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
9571fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
9581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
9591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
9601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
9611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
9621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
96396bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
96439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
96539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
96639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
96739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
96839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
96939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
97039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
97139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
97239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
97339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
97439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
97539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
97639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
977c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
9781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
9791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
9801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
9811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
9821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
9831fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
9841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
985077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
986077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
9874a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
988077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
989077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
990077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
991077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
9924a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
993077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
994077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
995077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
996077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
9978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
998077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
999077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
1000077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
1001077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1002077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
1003077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
1004077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
1005077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10064a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
1007077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
1008077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1009077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
1010077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
10118e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
1012077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
1013077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1014077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
1015077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
1016077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
1017077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
1018077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
1019077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
1020077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
1021077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
1022077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
1023077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
1024077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
1025077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
1026077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
1027d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
1028077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10294a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
1030077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
1031077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1032077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
1033077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
1034077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
10357687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
10367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
10407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
10427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
10437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
10447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
10467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
1048077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
1049077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
1050077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
1051077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1052077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
1053077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
1054077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
1055077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
1056077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
1057077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
1058077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
1059077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
1060077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
10617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
10627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
10634a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
10657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
10667687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
10677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
10687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
10697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
10707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
10717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
10727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
10734a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
10747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
10757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
10767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
10777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
10787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
10797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
10807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
10837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
10847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
10867687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
10877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
10887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10894a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
10917687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
10927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
10937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
10957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
10967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
10977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
10987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
10997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
11007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
11014a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
11027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
11037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
11047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
11057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
11067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
11077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
11087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
11097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
11107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
11114a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
11127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
11137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
11147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
11157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
11167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
11177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
11187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
11197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
11207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
11217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
1122725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
1123725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
1124725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
1125725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1126725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
1127725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
1128725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
1129725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
1130725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
1131725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
1132725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1133725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
1134725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
1135725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
1136725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
1137725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
1138725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
1139725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1140725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1141725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
1142725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
1143725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
1144725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
1145725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
1146725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
1147725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
1148725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1149725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
1150725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
1151725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
1152725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
1153725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1154725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1155725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
1156725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
1157725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
1158725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1159725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1160725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
1161725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
1162725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1163e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
116472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1165eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
11664acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct tgsi_token *tokens = pipeshader->selector->tokens;
11674acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct pipe_stream_output_info so = pipeshader->selector->so;
1168de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
11695555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
1170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
11714a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
1172457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
1173de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
117454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
117554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
1176ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Declarations used by llvm code */
1177ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	bool use_llvm = false;
11787f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned char * inst_bytes = NULL;
11797f5420762c0e3cb21bda66ea8ea32b516a4e3660Brian Paul	unsigned inst_byte_count = 0;
118072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1181ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1182ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	use_llvm = debug_get_bool_option("R600_LLVM", TRUE);
1183ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
1185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
118615ca9d159e50815b0bfe60df8873f48c32a59ca5Marek Olšák	ctx.native_integers = true;
1187951b888be45539e5d5b535a5a393df719fae4172Vadim Girlin
1188c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
1192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
1194f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1196725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
1197c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	ctx.fragcoord_input = -1;
1198725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
119954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
1200725a820b926575265e6790601a0defd9c30947dcVadim Girlin
12010c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_color_exports = 0;
12020c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	shader->nr_ps_max_color_exports = 0;
12030c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1204725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
1205feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
1206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
1207076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
1208076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
1209076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
1210f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
1211f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
1212f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
1214076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
1215076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
1216076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
1217076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
123289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
12334a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1234f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
12354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
1236f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
123889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
1239fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
124084457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
1241ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1242ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* LLVM backend setup */
1243ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#ifdef R600_USE_LLVM
1244ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm && ctx.info.indirect_files) {
1245ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		fprintf(stderr, "Warning: R600 LLVM backend does not support "
1246ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"indirect adressing.  Falling back to TGSI "
1247ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"backend.\n");
1248ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		use_llvm = 0;
1249ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1250ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1251ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		struct radeon_llvm_context radeon_llvm_ctx;
1252ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		LLVMModuleRef mod;
1253ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		unsigned dump = 0;
1254ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		memset(&radeon_llvm_ctx, 0, sizeof(radeon_llvm_ctx));
1255ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_ctx.reserved_reg_count = ctx.file_offset[TGSI_FILE_INPUT];
1256ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens);
1257ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) {
1258ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			dump = 1;
1259ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1260ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count,
1261ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard							rctx->family, dump)) {
1262ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			FREE(inst_bytes);
1263ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			radeon_llvm_dispose(&radeon_llvm_ctx);
1264ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			use_llvm = 0;
1265ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			fprintf(stderr, "R600 LLVM backend failed to compile "
1266ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				"shader.  Falling back to TGSI\n");
1267ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		} else {
1268ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_OUTPUT] =
1269ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard					ctx.file_offset[TGSI_FILE_INPUT];
1270ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		}
1271ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		radeon_llvm_dispose(&radeon_llvm_ctx);
1272ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1273ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard#endif
1274ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* End of LLVM backend setup */
1275ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1276ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (!use_llvm) {
1277ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		ctx.file_offset[TGSI_FILE_OUTPUT] =
1278ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.file_offset[TGSI_FILE_INPUT] +
1279ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			ctx.info.file_max[TGSI_FILE_INPUT] + 1;
1280ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
12824d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
1283d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
128497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
128597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
128697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
1287d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
12887728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
12898e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
12904d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
12918e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
1292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1293cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
1294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
12955555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
1301cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
1302cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
1303cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
1304cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
1305cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
1306cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
1307cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
1308cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
1309cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
1310cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
1318725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1319725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
1320725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
132191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
132291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1323725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
1324725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
132591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
132691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
132791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
132891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
132991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
1330725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
1331725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1332725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
1333725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
1334725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
1335725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
1336725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
1337725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1338725a820b926575265e6790601a0defd9c30947dcVadim Girlin
13390c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (shader->fs_write_all && rctx->chip_class >= EVERGREEN)
13400c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		shader->nr_ps_max_color_exports = 8;
13410c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
1342c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	if (ctx.fragcoord_input >= 0) {
1343cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		if (ctx.bc->chip_class == CAYMAN) {
1344cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			for (j = 0 ; j < 4; j++) {
1345cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				struct r600_bytecode_alu alu;
1346cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1347cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1348cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1349cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].chan = 3;
1350cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie
1351cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1352cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.chan = j;
1353cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.write = (j == 3);
1354cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.last = 1;
1355cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1356cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie					return r;
1357cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			}
1358cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		} else {
1359cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			struct r600_bytecode_alu alu;
1360cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1361cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1362cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
1363cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].chan = 3;
1364c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1365cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
1366cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.chan = 3;
1367cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.write = 1;
1368cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.last = 1;
1369cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
1370cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				return r;
1371cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		}
1372c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	}
1373c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
1374725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
1375725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
1376725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
1377725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
1378725a820b926575265e6790601a0defd9c30947dcVadim Girlin
1379725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
1380725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
1381725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
1382725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
1383725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
1384ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			if (use_llvm) {
1385ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard				continue;
1386ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard			}
1387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
1388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1390be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
1391be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
1392be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
13931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
13947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
13957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
13967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
13977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
13987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
139989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
140189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
140250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
140350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
140450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
1405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
1406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
1407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1410725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
1411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1413eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1414ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	/* Get instructions if we are using the LLVM backend. */
1415ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	if (use_llvm) {
1416ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		r600_bytecode_from_byte_stream(&ctx, inst_bytes, inst_byte_count);
1417ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard		FREE(inst_bytes);
1418ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard	}
1419ced73ea5df306156e5383b438d6858e58b1479e5Tom Stellard
1420457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
1421eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
142254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
142354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
142454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
142554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
142654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
142754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
142854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
142954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
143054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
143154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
143254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
143354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
14345a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		/* reset spi_sid for clipvertex output to avoid confusing spi */
14355a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		shader->output[ctx.cv_output].spi_sid = 0;
14365a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin
143754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
143854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
143954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
144054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
144154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
144254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
144354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
144454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
144554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
144654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
144754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
144854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
144954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
145054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
145154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
145254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
145354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
145454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
145554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
145654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
145754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
145854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
145954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
146054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
146154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
146254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
146354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
146454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
146554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1466543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1467543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1468543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1469543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1470543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1471543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1472543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1473543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1474543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1475543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1476543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
14778ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			if (so.output[i].dst_offset < so.output[i].start_component) {
14788ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
14792449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
14802449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1481543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1482543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1483543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1484543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
148588258e0dfe2371c2d591f27fba3511977e31e5eaAndreas Boll			output.elem_size = 0;
14868ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1487543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1488543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1489543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1490c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1491c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1492c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
14938ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1494543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1495543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1496543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1497543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1498543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1499543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1500543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1501543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1502543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1503543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1504543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1505543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1506543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1507543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1508543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1509543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1510543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1511543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1512543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1513543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1514543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1515543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1516543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1517543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1518543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1519543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1520543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1521543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1522543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1523543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1524543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1525543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1526543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1527543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1528543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1529543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1530543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1531eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
153254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
153354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
153454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
153554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
153654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
153754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
153854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
153954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
154054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
154154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
154254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
154354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1544457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
154691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
154791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
154854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
154954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
155091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
155191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
155291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
155354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
155454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
155554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
155654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
155754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
155891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
155991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
156054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
156154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
156254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
156354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
156454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
156554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
156654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
156754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
156854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
156954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
157054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
157191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
157213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
157313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
157413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
157513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
157613daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
15810c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				/* never export more colors than the number of CBs */
15820c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				if (next_pixel_base && next_pixel_base >= (rctx->nr_cbufs + rctx->dual_src_blend * 1)) {
15830c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					/* skip export */
15840c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					j--;
15850c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					continue;
15860c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				}
158726cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák				output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
158854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
158954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
15900c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				shader->nr_ps_color_exports++;
15914f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
15920c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin					for (k = 1; k < rctx->nr_cbufs; k++) {
159354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
159454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
159554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
159654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
159754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
159854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
159954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
160026cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák						output[j].swizzle_w = rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer ? 5 : 3;
160154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
160254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
160354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
160454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
160554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
16060c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin						shader->nr_ps_color_exports++;
1607feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1608feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
16095f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
161054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
161154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
161254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
161354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
161454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
161539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
161654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
161754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
161854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
161954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
162054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
163172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
163254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
163354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
163454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
163554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
163654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1637457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
163854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1639457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
164054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
164154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
164254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
164354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
164454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
164554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
164654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
164754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
164854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
164954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
165054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
165154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
165254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
165354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1654c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
165554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1656481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
16570c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && next_pixel_base == 0) {
165854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
165954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
166054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
166154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
166254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
166354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
166454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
166554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
166654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
166754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
166854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
166954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
167054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1671481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
167254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
167354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
167454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1675457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1676457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
167789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1681457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1682b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1683b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1684a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1685c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1686c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
16894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1690de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
169489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
16954a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
16967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1697783e4da72aa203a645737dec81b001341951a942Vadim Girlin	/* check GPR limit - we have 124 = 128 - 4
1698783e4da72aa203a645737dec81b001341951a942Vadim Girlin	 * (4 are reserved as alu clause temporary registers) */
1699783e4da72aa203a645737dec81b001341951a942Vadim Girlin	if (ctx.bc->ngpr > 124) {
1700783e4da72aa203a645737dec81b001341951a942Vadim Girlin		R600_ERR("GPR limit exceeded - shader requires %d registers\n", ctx.bc->ngpr);
1701783e4da72aa203a645737dec81b001341951a942Vadim Girlin		r = -ENOMEM;
1702783e4da72aa203a645737dec81b001341951a942Vadim Girlin		goto out_err;
1703783e4da72aa203a645737dec81b001341951a942Vadim Girlin	}
1704783e4da72aa203a645737dec81b001341951a942Vadim Girlin
17053b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1709cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1716f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1717f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
17264a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1727a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1728a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1729a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1730a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1731a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1732a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1733a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1734a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1735a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1736a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1737a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
17384a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1739f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1740f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1741f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1742f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1743f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
17444a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
17453efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
17463efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
17473efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
17483efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
174980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
175080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
175180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
17524a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
17547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
176047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
176147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
17627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
17637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
17647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1767dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1769dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1770d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1771d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1772dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1773d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1774d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1775d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1776dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1777dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1778dffad730df17983cfaef0808555a8c26cad0aa15Christian König
17799b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1780dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1781dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17824a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1783dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1784dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1786d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1787d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1788d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1789d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
17904a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
179180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1793d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1794d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17964a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1798d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
17994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
18004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
18054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
18077a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
18084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
18097a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18139b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18164a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1823d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1824d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1826d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1827d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1828d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1829d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
18309b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
18319b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
18329b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
18339b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
18349b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
18359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1836d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1837d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1838cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1839cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1840cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1841cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1842cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1843cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1844cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1845cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1846cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1847cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1848cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1849cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1850cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1851cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1852cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1853cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1854cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1855cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1856cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1857cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1858cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1859cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1860cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1861cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1862cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1863cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1864cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1865cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1866cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1867cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1868cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
18717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
18734a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
18747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
18757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
18774a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
18797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
1881fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák
1882fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák			/* RSQ should take the absolute value of src */
1883fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák			if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_RSQ) {
1884fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák				r600_bytecode_src_set_abs(&alu.src[j]);
1885fc62ee7e0d642e084175f36433aa42af63400799Marek Olšák			}
18867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
18897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
18917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
18947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
18957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
18967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
18977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
18987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1899d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1900d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{
1901d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1902d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int i, j, k, r;
1903d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct r600_bytecode_alu alu;
1904d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1905d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	for (k = 0; k < last_slot; k++) {
1906d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1907d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			continue;
1908d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
1909d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		for (i = 0 ; i < 4; i++) {
1910d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1911d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.inst = ctx->inst_info->r600_opcode;
1912d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1913d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1914d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			}
1915d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1916d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.dst.write = (i == k);
1917d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (i == 3)
1918d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				alu.last = 1;
1919d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
1920d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (r)
1921d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				return r;
1922d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		}
1923d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	}
1924d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	return 0;
1925d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie}
1926d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
19277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
192888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
192988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
193088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
193188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
19321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
193388f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
193496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
193596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
193696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
193796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
193896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
19394a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
19414a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1942a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
194388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
194488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
194588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
194688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
194788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
194888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19494a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
19507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1951921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
195288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1953a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
195496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1955ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
195688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19574a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
195888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
195988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
196088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19614a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1962a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
19637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
196488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
196588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
196688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
196788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
196888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
196988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
197088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
19714a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
197288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
197388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
197488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
19754a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1976a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
197788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
197888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
197988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
198088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
198188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
198288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
198388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
198488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
19857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1986921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
198788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1988921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1989ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
199096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
199189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1992a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1993a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
199496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
199596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
199696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
199796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
199896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
199996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
200088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
20014a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
200288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
200388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
200492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
200592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
200692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
20097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20104a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
20204a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
20287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
20297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
20307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20314a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
20337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
20347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
20357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
20377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
203892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
203992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
204092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20414a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
204292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
2043dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
204492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
20451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
204692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
204792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
204888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
20494a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
205088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
205188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
205288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
205388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
205488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
205588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
205688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
205788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
20584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
205988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
206088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
206188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
206288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
2063be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
2064be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2065be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
2066be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
20674a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2068a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2069be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
2070be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
207180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2072be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
207388f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
20744a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
207588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
207688f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
207788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
207888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
207988f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
208088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
208192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
208292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
208392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20844a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
208692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
208757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
208857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
208957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
209057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
20911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
209257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
209357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
209457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
209592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
209692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
209757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
209889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
21004a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
21027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
21047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
21057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
21077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
21087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
21097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
21107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21124a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21174a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
21197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
212092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
21217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
212857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
212992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
213092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
213157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
213289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
21337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
21344a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
21387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
21397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
21407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
21417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
21427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
21437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
21447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
21454a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
21467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
21477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
21487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
21497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
21504a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
21527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
215357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
21547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
21557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
21567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
216157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
216292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
2164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
21654a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
216980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
2170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
2172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
2182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
21834a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
218780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2190ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
2191ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
2192ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
2193ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
21944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2195ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
2196ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
2197ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
2198ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
219992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
220092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
220192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
2202094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
2203094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
22044a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2205094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
2206094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
2207094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
22084a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2209094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
22104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
22124502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
2213921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
22144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
22154502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
22164502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
22174502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
22184502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
22194a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
22204502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
2221094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
2222094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
2223094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
22244a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2225094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
2226094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
2227094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
22284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
22294502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
22304502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
22314502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
2232094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
2233094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
2234094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
22350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
22360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
22370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
22390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
22400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
2241f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
22424a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2243f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
22444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
2245f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2246f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
2247f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2248f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
2249f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
2250f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
2251f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
2252f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
22534a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2254f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
2255f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
2256f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
22570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
22580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
22596a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
22606a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
22617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
22626a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
226389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
22647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
2265f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
22664a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2268f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
2269f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
2270f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
2271f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
22727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
22737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
22747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
22757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
22767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
22777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
22784a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
22797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
22807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
22817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
22827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
2283f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
22844a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
2286f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
2287f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
22882fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
22892fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
22902fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
22917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
22924a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
22937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
22947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
22957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
22960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
22976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
22986a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
22990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
230086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
23014a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2302a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
230386f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
230486f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
23054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
23064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
23070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
23080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
23090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
23100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
23110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
23124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
23140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
23150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
231689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
23177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
23187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
23194a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
23227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
23237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
23257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
23267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
23277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
23287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
23294a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
23307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
23317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
23327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
23337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
23347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
23354a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
23377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
23387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
23397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
23407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
23414a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
23427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
23437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
23447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
23450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
2346abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23478567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
23484a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23498567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
23508567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
23518567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
23528567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
23538567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
23544a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
23558567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
23568567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
23578567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
2358abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
23594a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2360abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
23614a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2362abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
2363abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
2364abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
2365abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
23664a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2367abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2368abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2369abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
2370abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
23714a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2372abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2373abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
2374abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
2375abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
2376abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
2377abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
23784a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2379abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
2380abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
2381abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
23820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
23830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
23840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
238542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
238642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
238742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23884a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
238942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
239042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
23914a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2392df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2393370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
2394df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2395df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
2396df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2397df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
2398df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
239942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
24004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
24014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
240242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
240342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
240442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
240542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
24064a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
240742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
240842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
240942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
241042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
241142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
241242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
2413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
24147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
24157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
24187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
24197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
24204a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2422a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
24237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
242480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
24277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
24284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
24307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
24317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
24327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
24337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
24347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
2435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
2436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
2437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24384a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
2440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24414a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
2443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
24444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
2446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
24494a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
2453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2454a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2455a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
24567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
24587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
24604a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
24627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
24644a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
24664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
24677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
24697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24724a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
24757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
24784a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
24804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
24854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
24867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
24914a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
24947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
24977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
24987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
25007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
25017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
25027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
25037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
25047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
25057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2507a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
25084a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2510a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2511a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
25124a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2513a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25144a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2516a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2517a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25184a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2519a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2520a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2521a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
25224a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
252366f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
25244a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2525a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2526a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2527a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2528a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25294a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2530a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2531a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2532a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
25334a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2534a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2535a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2536a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2537a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2538a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
25394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2540a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2541a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2542a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2543a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2544a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2546332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2547332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2548332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
254929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int i, r, j;
2550332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2551332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2552332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
255429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int tmp3 = r600_get_temp(ctx);
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
25844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
25904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
25944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2600332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2601332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2602332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2603332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2604332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2606332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
26084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2610332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
26134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2614332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2616332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2618332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2624332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2626332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2629332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2630332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2632332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2634332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2652332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2653332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2674332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
26754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
26824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
26834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
26864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
26874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
26884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
26894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
26914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
26934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2694332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2695332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
269729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
269829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp3.x = u2f(src2) */
269929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
270029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2701332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
270229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
270329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
270429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
270529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
270629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
270729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
270829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
270929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
271029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
271129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
271229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
271429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
271529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
271629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
271729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp0.x = recip(tmp3.x) */
271829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 3; j++) {
271929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
272029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
272129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
272329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
272429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 0);
272529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp3;
272729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
272829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
272929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (j == 2)
273029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.last = 1;
273129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
273229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
273329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
273429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
273629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
273729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
273829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
273929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
274029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
274129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
274229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].value = 0x4f800000;
274329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
274429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
274529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
274629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
274729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
274829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (r)
274929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
275029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
275229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
275329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
275529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
275629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
275729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
275829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp3;
275929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
276029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
276129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
276229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
276329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
27644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
276629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
276729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
27684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
276929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
277029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
277129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
277229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
277329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
277429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
277529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
277629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
277729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
277829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
277929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
278029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
278129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
278229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
278329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
27844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
278629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
278729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
278829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
278929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2790332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
279129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
279229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
279329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
2794332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
279529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
279629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
279729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
279829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
279929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
280029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
280129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
280229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
280329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
280429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
280529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
280629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
280729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
28084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
280929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
281029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2811332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
281229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
281329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
281429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
281529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
281629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
281729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
281829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
281929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
282029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
282129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
282229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
282329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
282429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
282529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
282629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
282729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
282829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
28314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
28334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
28364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
28374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
28414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
284729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
284829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
284929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
285029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
28514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
285229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
285329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
285429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
28554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
285629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
285729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
28584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
285929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
286029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
286129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
286229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
286329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
286429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
286529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
286629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
286729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
286829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
28694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
287029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
287129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2872332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
287329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
287429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
287529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
287629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
287729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
287829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
287929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
288029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
288129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
288229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
288329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
288429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
288529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
288629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
288729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
288829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
288929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
289029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
2891332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
28934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2896332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
28994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
29004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
29034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
29064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
29074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
29094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
29114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
291329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
291429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
291529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
291629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2917332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
291829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
291929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
292029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 3);
29214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
292229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
292329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 2;
29244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
292529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
292629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
29274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
292829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
292929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
293029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
293129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
293229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		} else {
293329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
293429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
293529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
293629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
293729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 3;
293829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
293929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
294029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
294129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 2;
294229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
294329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
294429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 0;
294529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
294629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
294729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
294829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
294929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
29504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2954332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2955332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2957332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2958332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
29634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2964332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2966332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2967332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2969332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2971332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2972332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
29734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2974332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2975332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
29784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
29794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2980332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2981332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
29824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2983332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2984332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
29864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
29884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2989332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
29914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
29924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
29934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
29954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
29964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
29974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
29984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
29994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
30004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
30024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
30034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
30044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
300629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
300729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
300829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
300929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
30104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
301229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
301329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
30144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
301629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
30174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
301829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
301929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
302029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 0;
302129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
302229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
302329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
302429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
302529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
302629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
302729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
302829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
303029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
303129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
30324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
303329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
303429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
303529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
303629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
303729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
303829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
303929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
304029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
304129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
304229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
304329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
304429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
304529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
304629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
304729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
304829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
304929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
305029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
305329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
305429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
305529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
305629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
305829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
305929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
306029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
30614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
306229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
306329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].sel = tmp2;
306429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].chan = 1;
306529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
306629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
306729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
306829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
306929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
307029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 2;
307129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
307229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
307329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
307429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
307529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
30764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
307729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
307829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
30794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
308029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
308129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
308229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
30834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
308429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
308529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
308629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
308729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
308829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
308929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
309029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
309129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
309229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 2;
309329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
309429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
309529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
309629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
309729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
30984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
30994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
31004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
31024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
31044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
31054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
31064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
31094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
31104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
31124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
31134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
31154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
31204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
31224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
3124332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3125332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
31264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
3127332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
3128332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
31304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
31314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
31334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
31344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3137332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
3141332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
31434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
31454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
31474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
31484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
31494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
31514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
31524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
31534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
31544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
31554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
31564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
31584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
31594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
31614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3162332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3163332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
3165332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
3167332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
3169332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3170332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
31714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
3172332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
3173332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
3176332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
31774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
31794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
31804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
31814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
31824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
31834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
31854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
31864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
31874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
31894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
31914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
31934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
31944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
31954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
31964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
31974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
31984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
31994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
32004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
32014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
32024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
32034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
32044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
32084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
32104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
32124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
32144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
32164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
32204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
32214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
32224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
32264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
32284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
32304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
32324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
32334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
32364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
32374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
32384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
32404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3241332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
32424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3243332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
3244332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
32464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
32484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
32504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
32514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3252332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
32574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
32634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
3264332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
3267332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
32694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
32704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
3271332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
32724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
32734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
32744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
32754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
32764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
32774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
32784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
32804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
32814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
32824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
32844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
32864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
32874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
32884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
32894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
32904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
32914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
32924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
32934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
32944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
3295332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
3296332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
32974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
32984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
32994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
33004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
33014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
3302332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
33044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
3305332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
3306332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
33084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
33104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
33124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
33144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
33184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
33194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
33204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
33304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
33314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
33384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
33484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
33504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
33524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
33544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
33554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
33564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
33584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
33664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
33674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
33694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
33704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
33724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
33744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
33754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
33764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
33774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
33784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
33794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
33814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
33824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
33834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
33844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
33854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
3386332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
3387332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
3388332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
33894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
33904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
33924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
33954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
33964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
33974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
33984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
33994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
34004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
34014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
34024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
34034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
34044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
34054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
34064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
34074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
34084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
3409a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3410a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
3411a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin{
3412a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3413a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	struct r600_bytecode_alu alu;
3414a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int i, r;
3415a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
3416a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
3417a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3418a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3419a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3420a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3421a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3422a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3423a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
3424a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3425a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.sel = ctx->temp_reg;
3426a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.chan = i;
3427a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.dst.write = 1;
3428a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3429a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3430a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (i == last_inst)
3431a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3432a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3433a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3434a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3435a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3436a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3437a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	for (i = 0; i < 4; i++) {
3438a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (!(write_mask & (1<<i)))
3439a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			continue;
3440a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3441a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3442a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.inst = ctx->inst_info->r600_opcode;
3443a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3444a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3445a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3446a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].sel = ctx->temp_reg;
3447a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		alu.src[0].chan = i;
3448a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3449cd97a5f660399212a23b6dcd02906231f2dc5525Dave Airlie		if (i == last_inst || alu.inst == EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT)
3450a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			alu.last = 1;
3451a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
3452a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin		if (r)
3453a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin			return r;
3454a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	}
3455a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
3456a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	return 0;
3457a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin}
3458a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin
34596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
34606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
34616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
34626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
34636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
34646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
34656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
34666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
34686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
34746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
34766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
34776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
34816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
34836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
34846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
34856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
34866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
34876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
34886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
34906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
34916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
34926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
34936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
34966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
34976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
34986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
34996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
35006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
35026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
35036b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
35046b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
35056b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
35076b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
35086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
35096b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
35106b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
35116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
35126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
35136b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
35146b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
351542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
351642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
351742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
351842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
351942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
352042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
352142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
352242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
352342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
352442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
352542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
352642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
352742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
352842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
352942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
353042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
353142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
353342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
353442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
353542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
353642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
353742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
353842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
353942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
354142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
354242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
354342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
354442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
354542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
354642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
354742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
354842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
354942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
355042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
355142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
355342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
355442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
355542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
355642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
355842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
355942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
356042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
356142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
356242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
356342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
356442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
356542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
356642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
356742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
356842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
356942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
357042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
357142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
357242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
357342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
357442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
357542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
35766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
35780d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
35790d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
35800d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35814a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3582921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
35830d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35840d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
35850d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
35864a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3587a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
35880d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
3589cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
35900d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
3591cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
35920d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3594921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
35954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
35960d48925a56ad4fb253386110b545abda82a25464Dave Airlie
35970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
35980d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
35994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
36000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
36010d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
36020d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
36030d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36040d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
36050d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
36064a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3607a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
36080d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
360980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
36100d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3612cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
36130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
36140d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3615921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
36160d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
36170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36180d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
3619cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
36200d48925a56ad4fb253386110b545abda82a25464Dave Airlie
36210d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
36220d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
36234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
36240d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
36250d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
36260d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
36270d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
36280d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
36290d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3630cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
36324a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3633cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
3634cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
36364a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3637cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3638a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
36396c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
3640cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
3641a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
364280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
3644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
3645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
3647cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
3648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
36494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
3651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
3652cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
3653cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
3654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
3657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
3658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36594a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
3661dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
36637be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
36647be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
36657be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
36667be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
36674a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36704a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
367380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
3675cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
3676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
36777be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
3678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
36804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
36847be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
3688cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
3689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36904a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3691cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
3692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
36944a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
36974a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3698cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3699a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
370080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3701cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
3702a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3703cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
3704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
3705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
3706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
3707921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3709cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3710cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3711cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3713921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3714cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3715cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3716cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3717e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3718e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3719e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3720e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3721e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3722e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3723e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
37304a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
37347be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
37376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
37386415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
37396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3742192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3743192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
37446415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
37456415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
37476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
37486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
37496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
37506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
37526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
37536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
375433241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
375533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
375696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
375733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37584a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
37594a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3760641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
376140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3763da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3764da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
37656d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	const boolean src_requires_loading = inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ &&
37666d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák                                             tgsi_tex_src_requires_loading(ctx, 0);
376778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
37686d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	unsigned sampler_src_reg = inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ ? 0 : 1;
376978293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3770641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37716415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3772641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
37731d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
37741d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
37751d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
37761d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
37771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
37781d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
37791d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
37801d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
37811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
37821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
378313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
378413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
378513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
378640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
378740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
37884a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
378940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
379040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
379140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
379240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
379340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
379440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
379540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
379640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
379740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
379840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
379940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
380040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
380140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
38024a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
380340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
38044a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
380540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
380640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
380740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
380840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
380940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
38104a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
381140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
381240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
381340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
381413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
381540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
381640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
381740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
381840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
381940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
382040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
382140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
382240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
382340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
382440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
382540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
382640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
382740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
382840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
382940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
383040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
38314a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
383240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
383340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
383413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
383513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
38367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3837b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
383889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38414a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38514a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
38584a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38604a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
38647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38664a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
38709d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
38724a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3873a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3874b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
38764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3879b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
38804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3881b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3882b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3883b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
38844a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3885a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3886921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3887b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3888b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3889b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3890b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3891b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
38924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3893b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3894b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
389578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3896b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
38999783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
39009783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
39016d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ &&
39026d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ_LZ) {
3903261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
39040e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
39050e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
39094a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3910a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
39114a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
39124a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
39184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3922bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
392489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39264a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
39297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
39307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
39374a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
39457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
39467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
39477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
39497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
39514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
39557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
39587ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
39604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3961a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3962bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3966bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3971a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3975bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
39814a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3982a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3987bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
39897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3990bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3991bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3992a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
39994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
4001bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
40029783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
40039783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
40049783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
40059783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
40069783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
40079783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
40089783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
40099783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
40109783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
40119783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
40129783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
40139783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
40149783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
4015d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie
4016d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie		/* for cube forms of lod and bias we need to route the lod
4017d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie		   value into Z */
4018d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie		if (inst->Instruction.Opcode == TGSI_OPCODE_TXB ||
4019d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie		    inst->Instruction.Opcode == TGSI_OPCODE_TXL) {
4020d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4021d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4022d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
4023d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			alu.dst.sel = ctx->temp_reg;
4024d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			alu.dst.chan = 2;
4025d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			alu.last = 1;
4026d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			alu.dst.write = 1;
4027d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
4028d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie			if (r)
4029d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie				return r;
4030d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie		}
4031d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie
403278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
4033bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
4034bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
4035bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
403678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
4037b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
40384a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4039a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
40404a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
4041b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
4042b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
4043b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
4044b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
4045b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
40464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4047b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
4048b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
4049b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
405078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
4051b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
4052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
40537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4054bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
4055929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4056929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
40576b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
40589783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
4059929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
4060929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
4061de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
4062de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
4063de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
4064de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4065de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
4066de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
4067de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4068c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
4069c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
4070c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
4071de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
4072de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
4073de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
4074de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
4075de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
407633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
40774a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
4078bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
40796415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
40806415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
4081077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
4082641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
40836c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
40849d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
40859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
40869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
40879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
40886d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák
40896d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ_LZ) {
40906d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_x = 4;
40916d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_y = 4;
40926d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_z = 4;
40936d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák		tex.src_sel_w = 4;
40946d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	} else if (src_loaded) {
409578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
409678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
409778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
409878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
409978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
410078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
410178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
410278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
410378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
4104244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
410578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
41069a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
4107d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
4108d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
41099783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
41109783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
41119783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
4112d0a9ab29b2c8abf2900b1095883cba71b05b5cd9Dave Airlie		tex.src_sel_w = 2; /* route Z compare or Lod value into W */
41139783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
4114bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
41156b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
41166b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
411701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
411801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
411901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
41206b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
41216b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
4122bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
41231d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
41241d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
41251d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
412669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
4127929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
4128929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
4129929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
4130929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
4131929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
41326b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
4133929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
4134929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
4135929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
413678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
4137929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
4138929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
4139929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
4140929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
4141929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
4142929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
4143929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
4144929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
4145929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
4146929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
4147929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
4148929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
4149929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
4150929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
4151929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
4152929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
4153929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
4154bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
41554a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
4156bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
4157bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
4158bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
4159bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
4160bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
416133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
416233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
4163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
4164b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
4165b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41664a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4167dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
4169b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
4170b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4171c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
41721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
4173c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
4174c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4175c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
4176c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
41774a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4178c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
41794a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
41804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4181c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
418280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4183c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
4184c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
4185c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
4186c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
41874a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
4188c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
4189c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
4190c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
4191c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
4192c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
4193c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
4194b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
4195dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4196dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4197dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4198dffad730df17983cfaef0808555a8c26cad0aa15Christian König
41994a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4200a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
4201921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
4202b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
42034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
42044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
4205b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4206b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4207dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4208b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4209b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4210b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
42114a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4212b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4213b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4214b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4215b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4216b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
4217dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4218dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4219dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4220dffad730df17983cfaef0808555a8c26cad0aa15Christian König
42214a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4222a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
4223b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
4224b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
42254a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4226b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
4227b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4228dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4229b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4230b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
4231b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
42324a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4233b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4234b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4235b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4236b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
4237b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
4238dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
4239dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4240dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
4241dffad730df17983cfaef0808555a8c26cad0aa15Christian König
42424a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4243a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
4244b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
42454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42464a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
4247b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
4248b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
4249dffad730df17983cfaef0808555a8c26cad0aa15Christian König
425080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4251b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
4252dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
4253b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
4254b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
42554a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4256b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
4257b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
4258b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
4259dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
4260b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
4261b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
426287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
426387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
426487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
426687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
4267dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
426887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
42707be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
42717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
427287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4274a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
42754a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
42764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
42774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
427880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
427987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
428087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
428187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
42827be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
428387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
42844a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
428587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
428687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
42877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
428887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
428987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
429087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
42910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
42920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
42930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42940e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
42950e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
42964a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
42970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
42980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
42990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
43010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
43020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
43044a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4305a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
43060e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
43074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
43084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
43090e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
43100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
43110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
43120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
43130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
43140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
43150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
43170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
43180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
43190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
43210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
43224a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
43230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
43240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
43250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
43260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
43284a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4329a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
43300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43310e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
43324a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
43334a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
43340e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
43350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
43360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
43370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
43380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
43390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
43400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
43420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
43430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
43440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
43450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
43460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
434780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
434880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
43490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
43500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
43510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
43520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
43530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
43544a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
43550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
43560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
43570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
43580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
43590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
43600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
43610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
43620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
436336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
436436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
436536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
43664a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
436709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
43687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
436936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
437036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
437136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
43724a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
437336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4374a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
43754a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
437636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
437736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
437836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
437936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
438036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
43814a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
438236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
438336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
438436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
438589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
43867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
43877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
43887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
43897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
439036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
43917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
43927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
4393d9197f90372dec8a293d2d3e576261c6e3d38750Marek Olšák				alu.dst.write = i == 0;
4394d9197f90372dec8a293d2d3e576261c6e3d38750Marek Olšák				alu.last = i == 2;
43954a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
43967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
43977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
43987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
43997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
44027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
44037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
44067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
441236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
44137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
441436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
441536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
44164a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
441736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4418a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
44194a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
442036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
442136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
4422b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
4423b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4424b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
4425b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
4426b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
442736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
442836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
442936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
443036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
443136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44324a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
443336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
443436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
443536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
443636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
443736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
443836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
443989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
44407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
44414a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
444436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
44467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
44477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
44487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
44497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
44507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
445136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44524a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
44537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
44547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
44557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
44567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
44574a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
44587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
44594a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
446036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
44617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
44627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
44637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
44647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
44667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
44674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
44687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
44697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
44707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
447136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
447236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
447336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
447436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
44754a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
447636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
4477a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
447836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
447936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
448036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
448136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
448236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
448336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
448436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
44854a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
448636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
448736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
448836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
448936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
449036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
449187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
4492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
4493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
4494460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
44954a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
44977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
4498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4499f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
4500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
450189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45034a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45064a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45074a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
45087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
45127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
45154a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
4519460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45214a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45254a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
45287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
45297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
45307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
45314a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
45327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
45337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
45347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4535460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4536460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4537460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
4538460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4539460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4540460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4541460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
4542460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4543460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4544460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
45454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4546460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4547460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4548460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4549460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4550f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4551460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4552460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
455389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
45547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
45554a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
455696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45584a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45594a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
456096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
45617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
45627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
45637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
45647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
45657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
45667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
45677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45684a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
45697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
45707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
45717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
45727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
45734a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
45747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
45757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
45764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
45774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
45787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
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;
45837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
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_FLOOR);
459296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
459396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
459496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
459596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
459696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
459796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
459896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
459996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
460196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
460296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
460396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
460489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46064a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
46087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
46097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
46107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
46147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
461796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46184a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46234a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
46257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
46267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
462796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
46307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
463296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46334a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
463796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
463889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46404a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
46437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
46447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
46467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
46477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
46487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
46497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
46507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
46517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
46524a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
46537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
46547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
46557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
46567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
46574a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
46587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
46597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
46607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
466196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
46637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
46647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
46657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
466696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
46687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
46697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
46707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
467196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46724a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
467396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
467496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
467596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
46764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
46774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
467896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
467996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
468096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
4681460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4682460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4683460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
4684460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4685460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4686460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4688460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4689460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4690460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4691460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4692f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
4693460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
469489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
46957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
46964a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4697460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
46987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
46994a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47004a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
4701460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
47027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
47037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
47047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
47057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
47067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
47077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
4708460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
47094a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
47107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
47117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
47127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
47137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
47144a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
47157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
47167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
47174a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
47197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
47207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
47217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
47227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
47237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
47247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
47254a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
47267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
47277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
47287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4729460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4730460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4731460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4732460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
47334a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4734460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4735460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4736460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4737460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4738460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4739460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4740460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4741460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4742460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4743460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
47444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4745460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4746460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4747460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4748460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4749460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4750460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4751460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
475298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
475398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
475498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
475698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4757a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47584a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
475998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
476052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
476152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
476252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
476352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
476452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
476552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
476652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
47679b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
47688e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
47699b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
477052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
477152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
477252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
477352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
477452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
47758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
477698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
47778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
47788e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
47794a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
478098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
478198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
47828e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
47838e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
478498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
478598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
478698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
478747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
478847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
47894a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
479047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4791a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
47927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
47937ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4794077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4795077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
47964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
47978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4798077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4799077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4800077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
48014a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4802077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4803077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4804077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4805077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
48068e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
48078e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4808077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4809077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4810077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
48114a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4812077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
48137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
48147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4815077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4816077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
48174a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
48188e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4819077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4820077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4821077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
48224a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4823077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
48247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
48259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
48268e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
48278e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
48288e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
48298e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
48308e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
48318e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
48328e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
48338e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
48348e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
48359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
48367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
48377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
48387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
48397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
48407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48418e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
484247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
484347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
484447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
484557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
484657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
484757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
48484a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
484957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
485057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
485157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
48524a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
485357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4854a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
485580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
48567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
48577ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
485857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
485957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48604a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
486157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
486257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4863a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
486457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
486557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
48664a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
486757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
486857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
486957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
48704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
487157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
487257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
487357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
487457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
487557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
487657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4877a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
48794a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4881a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48824a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4883a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4884da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.execute_mask = 1;
4885da676eab93e7dad30b574b4eb4cffd4df952e819Vincent Lejeune	alu.update_pred = 1;
4886a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4887a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4888a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4889a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4890a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48914a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4892a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4893a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
48947ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4895a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4896a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
48974a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4898a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4899a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4900a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4901a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4902a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4903a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4904a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
49052bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
49062bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
49072bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
49082bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
49092bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
49104f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
49112bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
49124f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
49132bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
49142bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
49152bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
49162bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
49174f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
49182bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
49192bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
49204f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
49212bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
49222bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
49232bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
49242bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
49252bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
49262bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
49272bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
49284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
49298813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
49308813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
49318813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
49322bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4933a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4934a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4935a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
493609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4937a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
493809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
493909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
494009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
494109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
494209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
494309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
494409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
494509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
494609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
494709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
494809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
494909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
495009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
495109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4952a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
495309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
495409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
495509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
495609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
495709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
495809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
495909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
496009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
496109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
496209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
496309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4964a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4965a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4966a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
496709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
496809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
496909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
497009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
497109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
497209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
497309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
49747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
497509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
497609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
497709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
497809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
497909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
498009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
498109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
498209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
498309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
498409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
498509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
498609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
498709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
498809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
498909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
499009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
499109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
499209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
499309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
499409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
499509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
499609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
499709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
499809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
49994a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
50004a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
500109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
500209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
500309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
5004a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
500509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
500609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
5007a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
500809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
500909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
501009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
501109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
501209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
501309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
501409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
501509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
501609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
501709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
501809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
501909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
502009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
502109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
502209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
502309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
502409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
502509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
502609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
502709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50284f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
502909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
503009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
503109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
503209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
503309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
503409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50354f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
503609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
5037370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX work out offset */
503809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
503909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
5040a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
504109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
504209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
504309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
504409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
504509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
504609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
504709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50487ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
504909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
505009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
505109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
505209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
505309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
505409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
505509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
505609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
505709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
505809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
505909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
506009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
506109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
506209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
506309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50644a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
506509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
506609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
506709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
506809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
506909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
507009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
507109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
507209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
507309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
507409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
50758b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
507609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
50774a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
507809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
507909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
508009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
508109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
5082a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5083a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5084a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5085a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
5086a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
50874a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
5088a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
5089a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
509009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
5091a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
5092a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5093a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5094a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5095a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
5096a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
5097a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
5098a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
5099a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
5100a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
5101a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
5102a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5103a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
5104a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
5105a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
5106a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
510709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
5108a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
510909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
511009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
511209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
511309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
511409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
511509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
511609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
51174cf2be408eeabd7ae8b0d3c3c81a6dc17e98e323Tom Stellard	/* LOOP_START_DX10 ignores the LOOP_CONFIG* registers, so it is not
51184cf2be408eeabd7ae8b0d3c3c81a6dc17e98e323Tom Stellard	 * limited to 4096 iterations, like the other LOOP_* instructions. */
51194cf2be408eeabd7ae8b0d3c3c81a6dc17e98e323Tom Stellard	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_DX10));
512009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
512109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
5122a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
512309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
512409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
512509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
512609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
512709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
512809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
512909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
513009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
513109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
51324a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
513309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
513409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
513509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
513609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
513709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
513809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
513909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
514009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
514109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
514209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
514309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
514409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
514509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
514609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
514709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
514809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
514909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
515009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
5151370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX add LOOPRET support */
515209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
515309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
515409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
515509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
515609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
515709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
515809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
515909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
516009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
516109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
516209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
516309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
516409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
516509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
516609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
516709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
516809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
516909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
517009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
517109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
51724a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
517309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
517409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
517509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
517609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
5177a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
5178a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
5179a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
5180cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
5181cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
5182cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5183cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
5184cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
5185cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
5186cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5187cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
5188cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5189cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5190cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5191cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5192cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5193cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5194cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
5195cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
5196cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
5197cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5198c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
5199cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
5200cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
5201cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5202cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
52039b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
5204cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5205cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5206cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5207cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5208cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5209cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5210cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
5211cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
5212cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
5213cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5214cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5215cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
5216cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5217c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
5218cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5219cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
5220cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
5221cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5222cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
5223cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
5224cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
5225cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
5226cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
5227cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
5228cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
5229cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
5230cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
5231cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
5232cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
5233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
523498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
52360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
5237df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
5238370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
5239df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
5240df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
5241df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
5242df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
5243df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
524442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
524536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5246460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
5247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
5248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5249cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5250cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
525157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
5252dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
5253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
5254d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
5255be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
5256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
5257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
5258b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
5259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52663af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
5267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52683af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5269df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
52707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
52714558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
5272a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
52730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
5274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52767a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
5277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5278e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
527988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
52803af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
52813af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
52824502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
5283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52880d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
5289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
52900d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
529188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
5292d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
52930d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
5294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
529613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
5297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
5298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53049f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
5305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53080d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
530987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
531092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5311c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
5312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5314cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5315ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
531609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
5317a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
5318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5321a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
5322a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
5323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53288c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5329c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5330cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
53310ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5332d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
5333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5335c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5336c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
53374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5338cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
5339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
53411d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
534209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
5343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
534509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
5346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
534709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
5348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
53496d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
5350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5364094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
5365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
5366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
5367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5368bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
5369332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5370c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5371c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
53725893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5373c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5374d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
53750196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5376b8e9cf5d965ce09227cd9875c4381c73f237f196Marek Olšák	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans},
53779a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5378c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
53794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5380c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5381c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5382c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
53834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5384850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5385c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5386c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5387d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
53887383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5389c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
5390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5394cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5395a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,  0, 0, tgsi_unsupported},
5396a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
5397cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5398cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5399cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5400cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5401cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5402cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5403a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5404cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5405cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
54069b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
54079b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
54086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
540942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
5410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
541250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
541350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
541498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
541550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
541650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
541750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
54188ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
541950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
5420112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
542150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
542250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
542350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
542450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
542550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
542650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
542750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
542850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
542950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
543050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
543150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
543250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
543350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
543550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
543850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
543950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
544150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
544250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5443df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
544450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
544550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
544650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
544750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
544850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
544950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
545050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
545150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
545250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
545350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
545450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
545550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
545650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
545750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
545850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
545950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
546050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
546150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
546250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
546350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
546450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
546550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
546650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
546750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
546850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
546950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
547013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
547150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
547250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
54797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
54837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
54847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5485c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
54867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
54897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
54907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
54917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
54927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
54967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
54977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
54987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
54997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55028c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5503608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
5504cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
55057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5506d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
55077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5509cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5510cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
55114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5512cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
55137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55141d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
55151d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
55167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
55177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
55207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
55227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55236d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
55247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
55397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
55407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
55417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5542a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
5543332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5544cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5545cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5546cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5547cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5548d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5549cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5550a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
5551b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5552cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
55534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5554cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5555cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5556cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
55574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
55589b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5559cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5560cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5561d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
55627383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5563cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
55647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5568cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5569a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5570a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5571cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5572cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5573cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5574cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5575cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5576cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5577a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5578cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5579cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
55809b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
55819b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
55826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
558342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
55847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
55857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
55867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
55877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
55887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
55897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
55907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
55917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
55927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
55937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
55947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
55957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
55967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
55977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
55997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
56007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
56017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
56027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
56037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
56047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
56057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
56067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
56077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
56097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
56127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
56157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5617df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
56187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
56197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
56207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
56217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
56227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
56237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
56257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
56277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
56287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
56297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
56307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
56317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
56377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
56397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
56407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
56417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
56427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
564413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
56457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
56467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
564950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
565350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
565650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
565750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
565850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5659c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
566050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5663ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
566450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
566550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
566650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
566750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
566950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
567050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
567150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
567250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
567550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56768c98635d4fc7437b05debe337aef2377df685c0cKai Wasserbäch	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CEIL, tgsi_op2},
5677f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5678cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
56790ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5680f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
568150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
568250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5683f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5684f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
568529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5686cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
568750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
56891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
569050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
569150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
569450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
569550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
569650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
56976d3ad2dd2ba3ccdd211dbc618404519930631be2Marek Olšák	{TGSI_OPCODE_TXQ_LZ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
569850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
569950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
570450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
570950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
571050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
571150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
571250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
571350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
571450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
571550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5716f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
571729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5718cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5719cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5720f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5721f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5722f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5723f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5724f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5725f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5726f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
572729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5728f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5729f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5730f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
573129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5732d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5733f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5734f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5735f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5736f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5737f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
573850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
573950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
574050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
574150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5742cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5743a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I,      0, 0, tgsi_unsupported},
5744a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SAMPLE_I_MS,   0, 0, tgsi_unsupported},
5745cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5746cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5747cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5748cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5749cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5750cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5751a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez	{TGSI_OPCODE_SVIEWINFO,	0, 0, tgsi_unsupported},
5752cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5753cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5754f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
57559b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5756f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5757f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
575850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
575950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5760