r600_shader.c revision 330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8
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"
24077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h"
25a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h"
2672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
27330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák
28330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_info.h"
29330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_parse.h"
30330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_scan.h"
31330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_dump.h"
32de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
33843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano#include <byteswap.h>
34843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano
357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie/* CAYMAN notes
367779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieWhy CAYMAN got loops for lots of instructions is explained here.
377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie-These 8xx t-slot only ops are implemented in all vector slots.
397779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT
407779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops, with all four
417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieslots expecting the arguments on sources a and b. Result is
427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliebroadcast to all channels.
437779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT
447779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops in the z, y, and
457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliex slots.
467779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64
477779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64
487779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSQRT_IEEE/_64
497779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSIN/COS
507779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe w slot may have an independent co-issued operation, or if the
517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieresult is required to be in the w slot, the opcode above may be
527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieissued in the w slot as well.
537779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe compiler must issue the source argument to slots z, y, and x
547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie*/
557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
56a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
571235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
58e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
591235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
60843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	uint32_t *ptr;
61843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	int	i;
621235becaa1cf7e29f580900592563c3329d326deJerome Glisse
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
656101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		shader->bo = (struct r600_resource*)
666101b6d442b06a347c001fe85848d636ab7df260Marek Olšák			pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4);
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
691235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
70e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák		ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->buf, rctx->cs, PIPE_TRANSFER_WRITE);
71d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		if (R600_BIG_ENDIAN) {
72d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			for (i = 0; i < rshader->bc.ndw; ++i) {
73d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
74d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			}
75d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		} else {
76d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
77843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		}
786101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		rctx->ws->buffer_unmap(shader->bo->buf);
791235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
801235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
811235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
821235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
834f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
841235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
851235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
871235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
881235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
891235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
904f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
911235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
921235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
931235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
941235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
951235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
961235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
971235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
991235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse
102e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader);
1033b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
104eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
106052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
107e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse
110c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
111c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
112c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
113c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
114052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
115052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
116052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
117eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		tgsi_dump(shader->tokens, 0);
118543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
119543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		if (shader->so.num_outputs) {
120543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			unsigned i;
121543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			fprintf(stderr, "STREAMOUT\n");
122543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			for (i = 0; i < shader->so.num_outputs; i++) {
1232449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				unsigned mask = ((1 << shader->so.output[i].num_components) - 1) <<
1242449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák						shader->so.output[i].start_component;
125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				fprintf(stderr, "  %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i,
126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					shader->so.output[i].output_buffer, shader->so.output[i].register_index,
1272449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        mask & 1 ? "x" : "_",
1282449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 1) & 1 ? "y" : "_",
1292449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 2) & 1 ? "z" : "_",
1302449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 3) & 1 ? "w" : "_");
131543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
132543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
133052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
134eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	r = r600_shader_from_tgsi(rctx, shader);
1351235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1361235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1371235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_build(&shader->shader.bc);
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
144052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
1454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_dump(&shader->shader.bc);
146052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
147052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
148afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1501235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15169251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
152ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
1536101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
1544a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_clear(&shader->shader.bc);
155eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
156eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	memset(&shader->shader,0,sizeof(struct r600_shader));
157ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
158ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1591235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1611235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1632b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
164a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
165a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
166a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
167a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1732b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1742b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1752b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
18178293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	struct r600_bytecode			*bc;
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
18340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
18478293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				*literals;
18578293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				nliterals;
18678293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t				max_driver_temp_used;
187fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
188fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
189fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
190fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
192725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					face_gpr;
193725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					colors_used;
19454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	boolean                 clip_vertex_write;
19554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	unsigned                cv_output;
196c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	int					fragcoord_input;
1972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
20742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
221c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
222a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
227a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2298260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2318260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
23647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
244fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
24550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
24650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
2474a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
268fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
27150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
2734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
276738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_ZW;
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
278738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_XY;
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
281fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
286fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
29150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
2954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
3007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
30221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
310738334e80cf8a7b9fbf573f3a77cbf767ce81095Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INTERP_LOAD_P0;
31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
31321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
31421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
31621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
31821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
31921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
32021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
32121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
32221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
32321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
32421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
32521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
32621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
32721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
3287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3290a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
3300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
3310a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
3450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
3460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
3490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
3500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
3510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
3530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
3540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
3550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
3560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
3570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
3580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
3590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3600a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
3615b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3635b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
3835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
3855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
3865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
3875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
3885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
3895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
3915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
3925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
393725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
394725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
395725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
396725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
397725a820b926575265e6790601a0defd9c30947dcVadim Girlin
398725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
399725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
400725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
401725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
402725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
403725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
404725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
405725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
406725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
407725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
408725a820b926575265e6790601a0defd9c30947dcVadim Girlin
409725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
410725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
411725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
412725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
413725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
414725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
415725a820b926575265e6790601a0defd9c30947dcVadim Girlin
416725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
417725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
418725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
419725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
420725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
421725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
422725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
423725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
424725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
425725a820b926575265e6790601a0defd9c30947dcVadim Girlin
426725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
427725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
428725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
429725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
430725a820b926575265e6790601a0defd9c30947dcVadim Girlin
431725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
432725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
433725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
434725a820b926575265e6790601a0defd9c30947dcVadim Girlin
435725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
436725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
437725a820b926575265e6790601a0defd9c30947dcVadim Girlin
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
43972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
44296bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
44372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
4495b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
45035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4518a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
452024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
453725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
454c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			switch (ctx->shader->input[i].name) {
455c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_FACE:
456725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
457c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
458c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_COLOR:
459725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
460c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
461c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			case TGSI_SEMANTIC_POSITION:
462c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				ctx->fragcoord_input = i;
463c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				break;
464c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin			}
465725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
466c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin				if ((r = evergreen_interp_input(ctx, i)))
467725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
46950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
4755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
476024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
47735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
47891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
47991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
48091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
48191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
48291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
48391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
48491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
48591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
486e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák				ctx->shader->vs_out_point_size = 1;
48791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
48854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
48954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
49054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
49154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
49291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
49391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
49733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
49847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
50096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
501c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
502c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
5034a47662beaa2092447939db7880531fb706afeddMarek Olšák			struct r600_bytecode_alu alu;
5044a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
50596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
506c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
507c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
508c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
50996bbc627f369c0100b950f81531b1fe9ef586c34Christian König
51096bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
51196bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
51296bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
513c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
51496bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5154a47662beaa2092447939db7880531fb706afeddMarek Olšák			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
516c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
517c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
51839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
51939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
52572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
52672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
527be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
528be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
529be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
530be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
531be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
5327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
533fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
534fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
535fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
536fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
537fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
538fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
539fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
543fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
544fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
545fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
546fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
547fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
549fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
550fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
551fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
552fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
553fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
555fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
556fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
569fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
575370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX PULL MODEL and LINE STIPPLE, FIXED PT POS */
576fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
577fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
5791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
5801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
5811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
5821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
5831fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
5841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
5851fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
5861fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
5871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
5881fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
5891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
59096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
5921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
5931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
5941fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
5951fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
5961fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
5971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
5984a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
5991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
6001fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
6011fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
6021fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
6031fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
6041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
60596bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
60639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
60739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
60839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
60939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
61039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
61139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
61239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
61339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
61439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
61539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
61639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
61739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
61839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
619c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
6201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
6211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
6221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
6231fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
6241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
6251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
6261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
627077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
628077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
6294a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
630077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
633077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
6344a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
635077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
636077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
637077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
638077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
6398e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
640077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
641077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
642077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
643077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
644077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
645077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
646077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
647077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6484a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
649077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
650077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
651077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
652077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
6538e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
654077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
655077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
656077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
657077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
658077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
659077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
660077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
661077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
662077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
663077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
664077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
665077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
666077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
667077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
668077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
669d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
670077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6714a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
672077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
673077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
674077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
675077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
676077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6804a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
6817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
6827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
6867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
6887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
690077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
691077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
692077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
693077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
694077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
695077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
696077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
697077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
698077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
699077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
700077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
701077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
702077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
7037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
7047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
7054a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
7067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
7077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
7087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
7097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
7107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
7117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
7127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
7137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
7147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
7154a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
7167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
7177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
7187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
7197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
7207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
7217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
7227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
7257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
7267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
7277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
7287687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
7297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
7307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7314a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
7327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
7337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
7347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
7357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
7367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
7377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
7407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
7417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
7427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
7434a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
7447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
7457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
7467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
7477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
7487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
7497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
7507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
7517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
7527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
7534a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
7547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
7557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
7567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
7577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
7587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
7597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
7627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
7637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
764725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
765725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
767725a820b926575265e6790601a0defd9c30947dcVadim Girlin
768725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
770725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
771725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
772725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
773725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
774725a820b926575265e6790601a0defd9c30947dcVadim Girlin
775725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
776725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
777725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
778725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
779725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
780725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
781725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
782725a820b926575265e6790601a0defd9c30947dcVadim Girlin
783725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
784725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
785725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
786725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
787725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
788725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
789725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
790725a820b926575265e6790601a0defd9c30947dcVadim Girlin
791725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
792725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
793725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
794725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
795725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
796725a820b926575265e6790601a0defd9c30947dcVadim Girlin
797725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
798725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
799725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
800725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
801725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
802725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
803725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
804725a820b926575265e6790601a0defd9c30947dcVadim Girlin
805e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_shader *pipeshader)
80672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
807eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
808eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct tgsi_token *tokens = pipeshader->tokens;
809543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	struct pipe_stream_output_info so = pipeshader->so;
810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
8115555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
8134a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
814457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
81654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
81754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
81872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
821c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
827f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
829725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
830c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	ctx.fragcoord_input = -1;
831725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
83254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
833725a820b926575265e6790601a0defd9c30947dcVadim Girlin
834725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
835feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
836feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
838076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
839076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
840076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
841f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
842f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
843f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
845076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
846076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
847076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
848076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
86389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
8644a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
865f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
8664a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
867f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
86989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
870fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
87184457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
8734d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_INPUT] + 1;
874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
8754d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
876d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
87797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
87897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
87997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
880d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
8817728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
8828e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
8834d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
8848e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
886cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
887cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
8885555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
894cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
895cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
896cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
897cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
898cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
899cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
900cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
901cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
902cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
903cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
904de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
907de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
911725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
912725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
913725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
91491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
91591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
916725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
917725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
91891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
91991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
92091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
92191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
92291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
923725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
924725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
925725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
926725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
927725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
928725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
929725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
930725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
931725a820b926575265e6790601a0defd9c30947dcVadim Girlin
932c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	if (ctx.fragcoord_input >= 0) {
933cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		if (ctx.bc->chip_class == CAYMAN) {
934cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			for (j = 0 ; j < 4; j++) {
935cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				struct r600_bytecode_alu alu;
936cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
937cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
938cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
939cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.src[0].chan = 3;
940cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie
941cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
942cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.chan = j;
943cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.dst.write = (j == 3);
944cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				alu.last = 1;
945cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
946cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie					return r;
947cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			}
948cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		} else {
949cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			struct r600_bytecode_alu alu;
950cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
951cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
952cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].sel = shader->input[ctx.fragcoord_input].gpr;
953cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.src[0].chan = 3;
954c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
955cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.sel = shader->input[ctx.fragcoord_input].gpr;
956cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.chan = 3;
957cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.dst.write = 1;
958cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			alu.last = 1;
959cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie			if ((r = r600_bytecode_add_alu(ctx.bc, &alu)))
960cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie				return r;
961cb40165974856e5fc4fb7b138b3d9b1b0679cf18Dave Airlie		}
962c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin	}
963c4d644bac1e738af7e2a3f1bef7eea09df8bb81cVadim Girlin
964725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
965725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
966725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
967725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
968725a820b926575265e6790601a0defd9c30947dcVadim Girlin
969725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
970725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
971725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
972725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
973725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
975de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
977be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
978be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
979be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
9801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
9827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
9837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
9847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
9857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
98689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
9877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
98889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
98950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
99050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
99150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
992de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
994de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
997725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1000eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1001457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
1002eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
100354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
100454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
100554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
100654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
100754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
100854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
100954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
101054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
101154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
101254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
101354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
101454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
10155a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		/* reset spi_sid for clipvertex output to avoid confusing spi */
10165a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin		shader->output[ctx.cv_output].spi_sid = 0;
10175a84cc4ebcc99fb029d5f855e8afa11fab09266aVadim Girlin
101854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
101954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
102054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
102154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
102254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
102354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
102454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
102554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
102654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
102754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
102854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
102954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
103054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
103154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
103254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
103354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
103454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
103554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
103654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
103754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
103854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
103954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
104054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
104154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
104254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
104354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
104454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
104554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
104654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1047543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1048543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1049543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1050543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1051543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1052543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1053543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1054543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1055543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1056543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1057543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
10588ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			if (so.output[i].dst_offset < so.output[i].start_component) {
10598ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			   R600_ERR("stream_output - dst_offset cannot be less than start_component\n");
10602449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
10612449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1062543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1063543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1064543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1065543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1066543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
10678ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.array_base = so.output[i].dst_offset - so.output[i].start_component;
1068543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1069543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1070543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1071c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1072c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1073c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
10748ec05f06cba381ce757e18bc7c41f0bd33205926Marek Olšák			output.comp_mask = ((1 << so.output[i].num_components) - 1) << so.output[i].start_component;
1075543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1076543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1077543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1078543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1079543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1080543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1081543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1082543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1083543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1084543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1085543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1086543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1087543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1088543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1089543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1090543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1091543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1092543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1093543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1094543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1095543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1096543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1097543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1098543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1099543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1100543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1101543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1102543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1103543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1104543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1105543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1106543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1107543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1108543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1109543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1110543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1111543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1112eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
111354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
111454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
111554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
111654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
111754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
111854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
111954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
112054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
112154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
112254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
112354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
112454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1125457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
112791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
112891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
112954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
113054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
113191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
113291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
113391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
113454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
113554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
113654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
113754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
113854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
113991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
114091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
114154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
114254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
114354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
114454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
114554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
114654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
114754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
114854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
114954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
115054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
115154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
115291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
115313daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
115413daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
115513daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
115613daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
115713daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
116254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
116354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
11644f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
116554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					for (k = 1; k < shader->nr_cbufs; k++) {
116654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
116754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
116854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
116954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
117054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
117154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
117254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
117354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_w = 3;
117454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
117554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
117654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
117754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
117854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1179feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1180feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
11815f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
118254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
118354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
118454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
118554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
118654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
118739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
118854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
118954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
119054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
119154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
119254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
120372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
120454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
120554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
120654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
120754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
120854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1209457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
121054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1211457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
121254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
121354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
121454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
121554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
121654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
121754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
121854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
121954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
122054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
122154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
122254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
122354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
122454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
122554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1226c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
122754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1228481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
122954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && j == 0) {
123054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
123154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
123254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
123354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
123454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
123554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
123654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
123754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
123854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
123954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
124054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
124154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
124254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1243481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
124454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
124554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
124654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1247457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1248457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
124989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
12507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
12517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
12527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1253457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1254b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1255b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1256a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1257c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1258c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1259457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1260457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
12614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
12657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
126689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
12674a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
12687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12693b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1273cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1280f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1281f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
12904a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1291a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1292a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1293a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1294a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1295a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1296a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1297a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1298a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1299a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1300a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1301a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
13024a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1303f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1304f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1305f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1306f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1307f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
13084a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
13093efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
13103efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
13113efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
13123efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
131380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
131480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
131580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
13164a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
13187a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13197a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
132447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
132547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
13267a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
13277a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
13287a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1331dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1333dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1334d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1335d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1336dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1337d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1338d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1339d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1340dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1341dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1342dffad730df17983cfaef0808555a8c26cad0aa15Christian König
13439b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1344dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1345dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1347dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1348dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1350d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1351d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1352d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1353d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
13544a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
135580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1357d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1358d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
13604a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1362d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
13634a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
13644a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
13694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
13717a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
13724a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
13737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
13779b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
13804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1387d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1388d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
13899b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1390d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1391d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1392d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1393d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
13949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
13959b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
13969b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
13979b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
13989b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
13999b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1400d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1401d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1402cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1403cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1404cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1405cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1406cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1407cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1408cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1409cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1410cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1411cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1412cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1413cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1414cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1415cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1416cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1417cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1418cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1419cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1420cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1421cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1422cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1423cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1424cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1425cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1426cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1427cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1428cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1429cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1430cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1431cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1432cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
14337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
14347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
14357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
14374a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
14397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
14414a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
14437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
14444a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
14457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
14467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
14507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14514a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
14527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
14537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
14547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
14557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
14567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
14577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1458d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airliestatic int cayman_mul_int_instr(struct r600_shader_ctx *ctx)
1459d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie{
1460d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1461d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int i, j, k, r;
1462d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	struct r600_bytecode_alu alu;
1463d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
1464d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	for (k = 0; k < last_slot; k++) {
1465d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << k)))
1466d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			continue;
1467d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
1468d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		for (i = 0 ; i < 4; i++) {
1469d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1470d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.inst = ctx->inst_info->r600_opcode;
1471d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1472d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				r600_bytecode_src(&alu.src[j], &ctx->src[j], k);
1473d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			}
1474d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1475d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			alu.dst.write = (i == k);
1476d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (i == 3)
1477d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				alu.last = 1;
1478d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
1479d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie			if (r)
1480d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie				return r;
1481d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie		}
1482d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	}
1483d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	return 0;
1484d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie}
1485d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie
14867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
148788f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
148888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
148988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
149088f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
14911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
149288f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
149396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
149496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
149596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
149696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
149796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
14984a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
15004a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1501a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
150288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
150388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
150488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
150588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
150688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
150788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
15084a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
15097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1510921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
151188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1512a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
151396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1514ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
151588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
15164a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
151788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
151888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
151988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
15204a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1521a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
15227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
152388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
152488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
152588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
152688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
152788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
152888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
152988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
15304a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
153188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
153288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
153388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
15344a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1535a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
153688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
153788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
153888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
153988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
154088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
154188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
154288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
154388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
15447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1545921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
154688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1547921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1548ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
154996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
155089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1551a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1552a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
155396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
155496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
155596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
155696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
155796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
155896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
155988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
15604a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
156188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
156288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
156392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
156492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
156592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
15667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
15677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
15687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15694a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
15707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
15717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
15727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
15747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
15757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
15767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
15794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
15817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
15827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
15877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
15887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
15897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
15917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
15957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
15967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
159792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
159892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
159992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16004a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
160192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1602dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
160392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
16041fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
160592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
160692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
160788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
16084a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
160988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
161088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
161188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
161288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
161388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
161488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
161588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
161688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
16174a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
161888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
161988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
162088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
162188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1622be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1623be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1624be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1625be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
16264a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1627a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1628be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1629be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
163080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1631be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
163288f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
16334a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
163488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
163588f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
163688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
163788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
163888f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
163988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
164092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
164192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
164292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16434a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
16447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
164592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
164657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
164757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
164857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
164957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
16501fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
165157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
165257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
165357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
165492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
165592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
165657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
165789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
16587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
16594a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
16617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
16647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
16657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
16667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
16707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
16714a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
16727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
16737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
16747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
16757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
16764a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
167992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
16817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
16827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16834a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
16847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
16857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
16867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
168757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
168892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
168992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
169057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
169189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
16927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
16934a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
16957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
16977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
16987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
16997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
17007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
17017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
17027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
17037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
17044a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
17057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
17067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
17077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
17087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
17094a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
17117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
171257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
17137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
17147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
17157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
17164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
17177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
17187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
17197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
172057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
172192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1722ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1723ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
17244a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1725ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1726ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1727ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
172880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1729ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1730ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1731ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1732ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1733ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1734ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
17354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1736ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1737ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1738ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1739ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1740ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1741ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
17424a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1743ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1744ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1745ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
174680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1747ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1748ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1749ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1750ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1751ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1752ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
17534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1754ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1755ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1756ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1757ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
175892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
175992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
176092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1761094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1762094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
17634a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1764094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1765094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1766094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
17674a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1768094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
17694502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1770094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
17714502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1772921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
17734502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
17744502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
17754502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
17764502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
17774502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
17784a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
17794502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1780094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1781094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1782094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
17834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1784094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1785094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1786094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
17874502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
17884502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
17894502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
17904502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1791094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1792094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1793094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
17940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
17950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
17960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17974a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
17980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
17990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1800f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
18014a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1802f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
18034a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
1804f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1805f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
1806f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1807f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
1808f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
1809f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
1810f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1811f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
18124a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1813f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
1814f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
1815f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
18160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
18170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
18186a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
18196a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
18207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
18216a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
182289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
18237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
1824f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
18254a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1827f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
1828f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
1829f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
1830f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
18317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
18327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
18357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
18367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18374a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
18387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
1842f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
18434a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1845f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
1846f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
18472fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
18482fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
18492fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
18507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
18527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
18537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
18547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
18566a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
18576a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
18580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
185986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
18604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1861a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
186286f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
186386f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
18644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
18654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
18660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
18670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
18680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
18690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
18700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
18714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
18730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
18740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
187589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
18767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
18777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
18784a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
18807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
18817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
18827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
18847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
18877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
18884a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
18897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
18937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
18944a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
18967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
18977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
18987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
18997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
19017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
19027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
19037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
19040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1905abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
19068567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
19074a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19088567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
19098567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
19108567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
19118567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
19128567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
19134a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
19148567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
19158567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
19168567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
1917abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
19184a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1919abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
19204a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1921abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1922abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1923abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1924abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
19254a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1926abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1927abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1928abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1929abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
19304a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1931abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1932abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1933abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1934abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1935abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1936abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
19374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1938abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1939abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1940abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
19410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
19420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
19430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
194442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
194542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
194642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19474a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
194842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
194942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
19504a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1951df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1952370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
1953df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1954df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1955df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1956df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1957df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
195842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
19594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
19604a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
196142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
196242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
196342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
196442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
19654a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
196642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
196742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
196842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
196942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
197042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
197142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1972a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
19737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
19747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19754a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1976a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
19777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
19787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
19794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1981a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
19827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
198380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
19857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
19867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
19874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
19897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
19907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
19917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
19927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
19937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1994a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1995a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1996a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19974a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1998a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1999a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
20004a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2001a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
2002a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
20034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
2004a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
2005a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2006a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2007a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20084a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2009a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2010a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2011a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
2012a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2013a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2014a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
20194a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
20234a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
20254a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
20287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
20297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
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
20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
20374a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
20394a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
20407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
20417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
20427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
20437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
20444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
20457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
20467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
20477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
20497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
20504a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
20527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
20537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
20567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
20577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
20607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
20617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
20627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
20637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
20647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2065a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2066a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
20674a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2068a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2069a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2070a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
20714a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2072a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
20734a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2074a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2075a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2076a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20774a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2078a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2079a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2080a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
20814a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
208266f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
20834a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2084a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2085a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2086a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2087a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20884a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2089a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2090a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2091a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
20924a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2093a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2094a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2095a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2096a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2097a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20984a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2099a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2100a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2101a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2102a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2103a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
21044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2105332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2106332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2107332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
210829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int i, r, j;
2109332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2110332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2111332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
21124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
211329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	int tmp3 = r600_get_temp(ctx);
21144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
21154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
21174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
21194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
21204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
21214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
21224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
21234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
21244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
21254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
21264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
21274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
21284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
21294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
21314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
21324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
21334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
21354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
21374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
21384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
21404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
21424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
21434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
21454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
21474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
21494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
21504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
21524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
21534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
21554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
21574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
21584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2159332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2160332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2161332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2162332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2163332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2165332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
21674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2169332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
21724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2173332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2175332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2177332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
21814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2183332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2185332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2188332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2189332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2191332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2193332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
21974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
21994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
22004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
22014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
22044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
22064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
22074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
22084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
22104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2211332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2212332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
22134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
22154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
22164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
22184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
22204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
22214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
22234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
22244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
22254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
22274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
22284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
22294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
22304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
22324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2233332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
22344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
22364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
22384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
22394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
22414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
22424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
22434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
22454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
22464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
22474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
22484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
22504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
22524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2253332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2254332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
225629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
225729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp3.x = u2f(src2) */
225829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
225929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT);
2260332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
226129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
226229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
226329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
226429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
226529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
226629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
226729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
226829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
226929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
227029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
227129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
227229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
227329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
227429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
227529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
227629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			/* tmp0.x = recip(tmp3.x) */
227729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 3; j++) {
227829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
227929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
228029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
228129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
228229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
228329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 0);
228429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
228529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp3;
228629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
228729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
228829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (j == 2)
228929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.last = 1;
229029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
229129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
229229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
229329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
229429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
229529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
229629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
229729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
229829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
229929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
230029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
230129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].value = 0x4f800000;
230229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
230329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp3;
230429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
230529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
230629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
230729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (r)
230829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
230929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
231029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
231129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT);
231229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
231329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
231429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
231529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
231629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
231729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp3;
231829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
231929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
232029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
232129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
232229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
23234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
232529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
232629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
23274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
232829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
232929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 0;
233029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
233129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
233229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
233329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
233429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
233529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
233629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
233729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
233829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
233929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
234029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
234129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
234229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
23434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
234529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
234629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
234729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
234829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2349332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
235029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
235129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
235229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
2353332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
235429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
235529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
235629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
235729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
235829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
235929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
236029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
236129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
236229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
236329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
236429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
236529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
236629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
23674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
236829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
236929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2370332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
237129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
237229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
237329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
237429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
237529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
237629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
237729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
237829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
237929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
238029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
238129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
238229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
238329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
238429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
238529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
238629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
238729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
23884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
23904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
23924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
23954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
23984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
24004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
24044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
240629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
240729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
240829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
240929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
24104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
241129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
241229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
241329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
24144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
241529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
241629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
24174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
241829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
241929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
242029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 1;
242129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
242229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
242329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
242429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
242529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
242629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
242729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
24284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
242929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
243029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2431332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
243229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
243329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
243429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
243529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
243629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
243729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
243829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
243929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
244029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
244129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 1;
244229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
244329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
244429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
244529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
244629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
244729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
244829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
244929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
2450332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
24524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
24544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2455332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
24574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
24584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
24594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
24614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
24624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
24634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
24644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
24654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
24664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
24704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
247229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
247329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
247429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
247529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2476332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
247729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
247829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
247929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 3);
24804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
248129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
248229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 2;
24834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
248429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
248529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
24864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
248729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
248829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
248929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
249029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
249129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		} else {
249229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
249329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
249429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
249529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
249629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 3;
249729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
249829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
249929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
250029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 2;
250129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
250229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
250329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 0;
250429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
250529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
250629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
250729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
250829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
25094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
25114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2513332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2514332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
25154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2516332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2517332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
25194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
25204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
25214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
25224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2523332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
25244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2525332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2526332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2528332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2530332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2531332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
25324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2533332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2534332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
25364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
25384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2539332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2540332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2542332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2543332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2548332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
256529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
256629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
256729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
256829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
257029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
257129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
257229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 2);
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
257429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp0;
257529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 0;
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
257729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
257829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].sel = tmp2;
257929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[1].chan = 0;
258029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
258129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
258229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
258329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
258429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
258529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
258629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
258729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
258929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
259029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
259229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
259329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 2;
259429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
259529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
259629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].sel = tmp0;
259729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[0].chan = 0;
259829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
259929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
260029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp2;
260129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 0;
260229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
260329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
260429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
260529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
260629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
260729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
260829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
260929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
26104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
261229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		if (ctx->bc->chip_class == CAYMAN) {
261329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			for (j = 0 ; j < 4; j++) {
261429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
261529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
261729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.sel = tmp0;
261829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.chan = j;
261929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.dst.write = (j == 1);
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
262129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if (signed_op) {
262229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].sel = tmp2;
262329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					alu.src[0].chan = 1;
262429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				} else {
262529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
262629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				}
262729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
262829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].sel = tmp0;
262929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[1].chan = 2;
263029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
263129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.last = (j == 3);
263229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
263329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie					return r;
263429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
263629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
263729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
263929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.sel = tmp0;
264029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.chan = 1;
264129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.dst.write = 1;
26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
264329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if (signed_op) {
264429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].sel = tmp2;
264529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				alu.src[0].chan = 1;
264629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			} else {
264729cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
264829cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			}
264929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
265029cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].sel = tmp0;
265129cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.src[1].chan = 2;
265229cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie
265329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			alu.last = 1;
265429cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
265529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie				return r;
265629cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie		}
26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
26744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
26754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
26814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
2683332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2684332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
26854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2686332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2687332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
26894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
26904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
26914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
26924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
26934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
26944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
26954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2696332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
26984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
2700332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
27024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
27044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
27064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
27074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
27084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
27104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
27114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
27124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
27134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
27144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
27154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
27174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
27184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
27204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2721332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2722332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
2724332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
2726332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2728332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2729332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
27304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
2731332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2732332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
27344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
2735332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
27374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
27384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
27394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
27404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
27414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
27424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
27444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
27454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
27464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
27484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
27504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
27524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
27534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
27544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
27564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
27574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
27584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
27594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
27604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
27614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
27624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
27634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
27654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
27664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
27674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
27694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
27714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
27734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
27754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
27764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
27774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
27794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
27804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
27814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
27834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
27844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
27854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
27874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
27894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
27914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
27924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
27934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
27954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
27964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
27974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
27994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2800332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
28014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2802332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2803332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
28054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
28074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
28094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
28104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
2811332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
28134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
28144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
28154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
28164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
28224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
2823332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2826332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
28284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
28294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
2830332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
28324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
28334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
28344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
28354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
28364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
28374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
28414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
28434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
28454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
28464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
28484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
28494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
28504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
28514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
28524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
28534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2854332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2855332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
28564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
28574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
28584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
28594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
28604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
2861332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
28634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2864332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2865332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
28664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
28674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
28694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
28714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
28734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
28754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
28774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
28784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
28794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
28814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
28824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
28834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
28854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
28864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
28874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
28894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
28904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
28924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
28934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
28954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
28964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
28974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
28984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
28994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
29004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
29014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
29034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
29054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
29074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
29094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
29114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
29134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
29144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
29154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
29174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
29184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
29194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
29214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
29234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
29254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
29264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
29284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
29294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
29314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
29334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
29344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
29354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
29364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
29374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
29384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
29404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
29414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
29424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
29434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
29444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
2945332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
2946332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
2947332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
29484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
29494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
29504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
29514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
29524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
29544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
29554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
29564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
29574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
29594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
29604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
29614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
29624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
29644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
29654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
29664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
29674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
29686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
29696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
29706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
29726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
29736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
29746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
29756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
29766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
29776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
29786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
29796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
29806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
29816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
29826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
29836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
29846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
29856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
29866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
29876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
29886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
29896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
29906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
29916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
29926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
29936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
29946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
29956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
29966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
29976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
29986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
29996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
30006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
30016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
30026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
30036b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
30046b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
30056b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
30066b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
30076b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
30086b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
30096b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
30106b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
30116b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
30126b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
30136b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
30146b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
30156b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
30166b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
30176b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
30186b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
30196b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
30206b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
30216b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
30226b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
30236b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
302442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
302542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
302642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
302742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
302842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
302942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
303042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
303142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
303242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
303342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
303442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
303542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
303642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
303742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
303842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
303942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
304042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
304142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
304242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
304342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
304442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
304542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
304642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
304742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
304842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
304942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
305042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
305142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
305242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
305342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
305442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
305542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
305642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
305742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
305842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
305942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
306042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
306142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
306242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
306342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
306442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
306542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
306642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
306742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
306842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
306942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
307042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
307142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
307242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
307342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
307442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
307542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
307642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
307742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
307842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
307942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
308042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
308142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
308242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
308342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
308442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
30856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
30866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
30870d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
30880d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
30890d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30904a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3091921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
30920d48925a56ad4fb253386110b545abda82a25464Dave Airlie
30930d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
30940d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
30954a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3096a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
30970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
3098cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
30990d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
3100cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
31010d48925a56ad4fb253386110b545abda82a25464Dave Airlie
31024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3103921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
31044a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
31050d48925a56ad4fb253386110b545abda82a25464Dave Airlie
31060d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
31070d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
31084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
31090d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
31100d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
31110d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
31120d48925a56ad4fb253386110b545abda82a25464Dave Airlie
31130d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
31140d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
31154a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3116a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
31170d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
311880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
31190d48925a56ad4fb253386110b545abda82a25464Dave Airlie
31200d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3121cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
31220d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
31230d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3124921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
31250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
31260d48925a56ad4fb253386110b545abda82a25464Dave Airlie
31270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
3128cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
31290d48925a56ad4fb253386110b545abda82a25464Dave Airlie
31300d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
31310d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
31324a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
31330d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
31340d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
31350d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
31360d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
31370d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
31380d48925a56ad4fb253386110b545abda82a25464Dave Airlie
3139cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
3140cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
31414a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3142cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
3143cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3144cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
31454a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3146cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
3147a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
31486c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
3149cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
3150a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
315180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3152cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
3153cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
3154cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3155cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
3156cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
3157cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
31584a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3159cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
3160cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
3161cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
3162cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
3163cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3164cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
3166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
3167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
31684a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
3170dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
31727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
31737be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
31747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
31757be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
31764a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
31794a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
31817be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
318280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
3184cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
3185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
31867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
3187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
31894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
31937be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3194cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
3195cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3196cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
3197cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
3198cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
31994a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3200cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
3201cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
3202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
32034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3204cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
3205cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
32064a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3207cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
3208a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
320980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3210cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
3211a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
3212cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
3213cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
3214cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
3215cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
3216921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3217cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3218cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3219cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3220cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3221cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3222921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3223cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3224cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3225cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3226e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3227e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3228e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3229e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3230e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3231e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3232e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3233cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3234cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
32394a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
32437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
32466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
32476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
32486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
32496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
32506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
3251192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_INPUT &&
3252192467108b282c19da3b11647a7a802b3d890193Christian König		inst->Src[index].Register.File != TGSI_FILE_OUTPUT) ||
32536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
32546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
32556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
32566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
32576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
32586415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
32596415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
32606415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
32616415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
32626415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
326333241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
326433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
326596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
326633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
32674a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
32684a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3269641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
327040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3271bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3272da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3273da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
32746415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
327578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
327613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
327778293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint8_t offset_x = 0, offset_y = 0, offset_z = 0;
3278641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
32796415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3280641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
32811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
32821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
32831d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
32841d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
32851d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
32861d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
32871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
32881d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
32891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
32901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
329113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
329213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
329313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
329440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
329540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
32964a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
329740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
329840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
329940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
330040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
330140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
330240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
330340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
330440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
330540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
330640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
330740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
330840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
330940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
33104a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
331140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
33124a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
331340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
331440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
331540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
331640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
331740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
33184a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
331940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
332040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
332140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
332213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
332340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
332440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
332540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
332640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
332740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
332840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
332940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
333040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
333140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
333240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
333340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
333440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
333540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
333640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
333740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
333840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
33394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
334040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
334140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
334213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
334313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
33447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3345b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
334689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
33477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
33487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
33494a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
33514a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3352bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
33537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
33547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
33557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
33567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
33577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
33587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
33594a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
33607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
33617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
33627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
33637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
33647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
33657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
33664a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
33677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
33684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
33697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
33707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
33717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
33727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
33737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
33744a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
33757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
33767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
33777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
33789d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3379b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
33804a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3381a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3382b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
33837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
33844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3385b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3386b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3387b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
33884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3389b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3390b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3391b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
33924a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3393a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3394921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3395b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3396b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3397b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3398b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3399b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
34004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3401b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3402b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
340378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3404b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3405bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3406bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
34079783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
34089783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
3409261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ) {
3410261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
34110e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
34120e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3413bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3414bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3415bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
34164a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3417a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
34184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
34194a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3420bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3421bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3422bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3423bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3424bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
34254a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3426bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3427bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3428bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3429bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3430bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
343189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
34327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
34334a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
34357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
34367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
34377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
34387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
34397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
34407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
34417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
34427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
34437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
34444a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
34457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
34467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
34477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
34487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
34494a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
34507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
34517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
34527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
34537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
34547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
34557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
34567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
34577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
34584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
34597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
34607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
34617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
34627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3463bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3464bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
34657ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3466bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
34674a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3468a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3469bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3470bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3471bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3472bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3473bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3474bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
34757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3476bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3477bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3478a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3479bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3480bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3481bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3482bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3483bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
34844a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3485bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3486bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3487bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
34884a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3489a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3490bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3491bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3492bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3493bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3494bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3495bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
34967ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3497bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3498bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3499a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3500bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3501bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3502bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3503bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3504bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3505bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
35064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3507bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3508bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
35099783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
35109783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
35119783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
35129783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
35139783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
35149783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
35159783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
35169783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
35179783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
35189783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
35199783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
35209783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
35219783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
352278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3523bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
3524bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3525bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
352678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
3527b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
35284a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3529a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
35304a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3531b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3532b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3533b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
3534b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
3535b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
35364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3537b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3538b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3539b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
354078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3541b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3542b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
35437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3544bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
3545929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3546929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
35476b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
35489783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
3549929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
3550929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
3551de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
3552de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
3553de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
3554de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3555de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
3556de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
3557de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3558c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
3559c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
3560c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
3561de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
3562de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
3563de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3564de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
3565de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
356633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
35674a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
3568bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
35696415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
35706415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
3571077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
3572641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
35736c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
35749d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
35759d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
35769d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
35779d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
357878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
357978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
358078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
358178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
358278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
358378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
358478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
358578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
358678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
358778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
3588244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
358978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
35909a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
3591bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
3592bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
3593bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
3594bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
3595bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
3596bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
35979783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
35989783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
35999783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
36009783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
36019783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_w = 2; /* route Z compare value into W */
36029783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
3603bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
36046b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
36056b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
360601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
360701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
360801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
36096b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
36106b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
3611bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
36121d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
36131d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
36141d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
361569d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
3616929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
3617929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
3618929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
3619929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3620929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
36216b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
3622929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
3623929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
3624929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
362578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
3626929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
3627929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
3628929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
3629929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
3630929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
3631929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
3632929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
3633929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
3634929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
3635929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
3636929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
3637929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
3638929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
3639929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
3640929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
3641929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
3642929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
3643bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
36444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
3645bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
3646bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
3647bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3648bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
3649bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
365033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
365133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
3652b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
3653b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
3654b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3656dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3657b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
3658b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
3659b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3660c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
36611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
3662c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
3663c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3664c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
3665c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
36664a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3667c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
36684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
36694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3670c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
367180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3672c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
3673c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
3674c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
3675c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
36764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3677c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
3678c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
3679c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
3680c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
3681c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
3682c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
3683b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
3684dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3685dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3686dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3687dffad730df17983cfaef0808555a8c26cad0aa15Christian König
36884a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3689a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
3690921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3691b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
36924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
36934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
3694b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
3695b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3696dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3697b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3698b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
3699b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
37004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3701b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3702b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3703b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3704b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3705b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
3706dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3707dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3708dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3709dffad730df17983cfaef0808555a8c26cad0aa15Christian König
37104a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3711a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3712b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
3713b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
37144a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3715b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
3716b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3717dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3718b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3719b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
3720b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
37214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3722b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3723b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3724b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3725b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3726b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
3727dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3728dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3729dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3730dffad730df17983cfaef0808555a8c26cad0aa15Christian König
37314a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3732a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3733b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
37344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
37354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3736b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
3737b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
3738dffad730df17983cfaef0808555a8c26cad0aa15Christian König
373980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3740b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3741dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3742b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3743b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
37444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3745b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3746b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3747b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3748dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
3749b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
3750b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
375187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
375287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
375387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37544a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
375587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
3756dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
375787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
37587be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
37597be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
37607be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
376187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
37624a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3763a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
37644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
37654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
37664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
376780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
376887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
376987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
377087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
37717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
377287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
37734a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
377487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
377587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
37767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
377787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
377887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
377987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
37800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
37810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
37820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37830e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
37840e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
37854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
37860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
37870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
37880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
37890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
37900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
37910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
37920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
37934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3794a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
37950e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
37964a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
37974a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
37980e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
37990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
38000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
38010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
38020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
38030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
38040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
38050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
38060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
38070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
38080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
38090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
38100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
38114a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
38120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
38130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
38140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
38150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
38160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
38174a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3818a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
38190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
38200e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
38214a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
38224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
38230e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
38240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
38250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
38260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
38270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
38280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
38290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
38300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
38310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
38320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
38330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
38340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
38350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
383680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
383780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
38380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
38390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
38400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
38410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
38420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
38434a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
38440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
38450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
38460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
38470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
38480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
38490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
38500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
38510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
385236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
385336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
385436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
38554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
385609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
385836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
385936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
386036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
38614a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
386236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3863a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
38644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
386536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
386636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
386736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
386836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
386936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
38704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
387136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
387236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
387336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
387489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
387936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38864a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
390336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
39047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
390536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
390636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
39074a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
390836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3909a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
39104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
391136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
391236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
3913b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
3914b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3915b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
3916b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
3917b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
391836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
391936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
392036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
392136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
392236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
39234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
392436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
392536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
392636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
392736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
392836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
392936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
393089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39324a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
39344a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
393536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
39367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
39397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
39417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
394236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
39434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39484a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
39504a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
395136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
39527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
39557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
39577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
396236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
396336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
396436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
396536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
39664a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
396736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3968a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
396936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
397036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
397136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
397236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
397336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
397436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
397536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
39764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
397736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
397836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
397936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
398036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
398136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
398287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
3983460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
3984460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
3985460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
39864a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3987460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
39887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
3989460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3990f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
3991460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
399289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39944a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3995460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
39974a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
39984a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
39997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
40007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
40017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
40027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
40037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
40047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
40057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
40064a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
40077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
40087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
40097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
4010460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
40117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
40124a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
40137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
40147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
40154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
40177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
40187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
40197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
40207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
40217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
40224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
40237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
40247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
40257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4026460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4027460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
4028460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
4029460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4030460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4031460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4032460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
4033460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4034460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4035460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
40364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4037460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4038460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4039460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4040460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4041f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
4042460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
4043460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
404489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
40457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
40464a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
404796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
40487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
40494a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40504a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
405196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
40527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
40537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
40547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
40557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
40567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
40577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
40587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
40594a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
40607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
40617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
40627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
40637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
40644a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
40657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
40667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
40674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
40697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
40707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
40717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
40727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
40737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
40747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
40754a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
40767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
40777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
40787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
407996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
40804a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
408196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
408296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
408396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
408496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
408596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
408696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
408796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
408896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
408996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
409096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
40914a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
409296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
409396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
409496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
409589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
40967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
40974a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
40987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
40997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
41007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
41017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
41027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
41037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
41047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
41057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
41067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
41077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
410896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
41094a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
41107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
41117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
41127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
41137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
41144a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
41157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
41167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
41177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
411896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
41197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
41207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
41217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
41227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
412396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
41244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
41257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
41267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
41277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
412896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
412989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
41307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
41314a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
41327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
41337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
41347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
41357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
41367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
41377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
41387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
41397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
41407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
41417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
41427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
41434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
41447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
41457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
41467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
41477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
41484a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
41497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
41507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
41517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
415296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
41537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
41547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
41557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
41567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
415796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
41584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
41597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
41607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
41617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
416296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
41634a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
416496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
416596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
416696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
41674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
41684a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
416996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
417096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
417196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
4172460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4173460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4174460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
4175460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4176460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4177460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
41784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4179460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4180460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4181460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4182460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4183f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
4184460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
418589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
41867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
41874a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4188460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
41897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
41904a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
41914a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
4192460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
41937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
41947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
41957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
41967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
41977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
41987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
4199460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
42004a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
42017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
42027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
42037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
42047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
42054a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
42067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
42077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
42084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
42094a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
42107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
42117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
42127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
42137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
42147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
42157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
42164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
42177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
42187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
42197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
4220460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4221460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4222460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4223460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
42244a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4225460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4226460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4227460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4228460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4229460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4230460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4231460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4232460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4233460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4234460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
42354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4236460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4237460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4238460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4239460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4240460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4241460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4242460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
424398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
424498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
424598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
424798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4248a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
42494a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
425098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
425152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
425252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
425352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
425452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
425552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
425652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
425752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
42589b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
42598e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
42609b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
426152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
426252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
426352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
426452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
426552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
42668e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
426798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
42688e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
42698e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
42704a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
427198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
427298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
42738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
42748e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
427598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
427698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
427798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
427847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
427947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
42804a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
428147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4282a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
42837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
42847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4285077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4286077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
42874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
42888e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4289077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4290077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4291077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
42924a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4293077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4294077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4295077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4296077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
42978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
42988e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4299077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4300077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4301077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
43024a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4303077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
43047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
43057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4306077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4307077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
43084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
43098e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4310077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4311077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4312077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
43134a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4314077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
43157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
43169b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
43178e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
43188e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
43198e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
43208e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
43218e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
43228e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
43238e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
43248e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
43258e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
43269b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
43277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
43287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
43297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
43307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
43317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
43328e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
433347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
433447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
433547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
433657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
433757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
433857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
43394a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
434057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
434157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
434257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
43434a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
434457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4345a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
434680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
43477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
43487ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
434957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
435057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
43514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
435257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
435357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4354a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
435557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
435657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
43574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
435857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
435957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
436057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
43614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
436257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
436357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
436457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
436557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
436657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
436757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4368a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4369a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
43704a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4371a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4372a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
43734a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4374a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4375a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
4376a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4377a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4378a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4379a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4380a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
43814a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4382a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4383a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
43847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4385a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4386a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
43874a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4388a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4389a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4390a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4391a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4392a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4393a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4394a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
43952bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
43962bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
43972bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
43982bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
43992bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
44004f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
44012bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
44024f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
44032bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
44042bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
44052bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
44062bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
44074f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
44082bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
44092bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
44104f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
44112bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
44122bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
44132bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
44142bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
44152bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
44162bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
44172bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
44184a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
44198813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
44208813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
44218813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
44222bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4423a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4424a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4425a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
442609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4427a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
442809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
442909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
443009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
443109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
443209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
443309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
443409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
443509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
443609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
443709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
443809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
443909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
444009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
444109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4442a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
444309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
444409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
444509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
444609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
444709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
444809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
444909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
445009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
445109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
445209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
445309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4454a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4455a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4456a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
445709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
445809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
445909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
446009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
446109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
446209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
446309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
44647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
446509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
446609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
446709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
446809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
446909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
447009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
447109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
447209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
447309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
447409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
447509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
447609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
447709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
447809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
447909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
448009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
448109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
448209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
448309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
448409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
448509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
448609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
448709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
448809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
44894a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
44904a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
449109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
449209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
449309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4494a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
449509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
449609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4497a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
449809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
449909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
450009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
450109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
450209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
450309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
450409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
450509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
450609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
450709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
450809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
450909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
451009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
451109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
451209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
451309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
451409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
451509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
451609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
451709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
45184f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
451909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
452009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
452109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
452209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
452309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
452409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
45254f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
452609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
4527370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX work out offset */
452809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
452909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4530a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
453109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
453209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
453309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
453409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
453509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
453609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
453709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
45387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
453909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
454009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
454109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
454209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
454309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
454409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
454509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
454609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
454709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
454809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
454909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
455009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
455109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
455209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
455309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
45544a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
455509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
455609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
455709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
455809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
455909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
456009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
456109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
456209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
456309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
456409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
45658b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
456609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
45674a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
456809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
456909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
457009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
457109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
4572a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4573a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4574a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4575a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
4576a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
45774a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
4578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
4579a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
458009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
4581a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
4582a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4583a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4584a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4585a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
4586a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
4587a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
4588a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
4589a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
4590a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
4591a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
4592a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4593a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
4594a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
4595a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
4596a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
459709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
4598a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
459909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
460009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
460109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
460209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
460309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
460409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
460509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
460609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
46074a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
460809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
460909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
4610a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
461109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
461209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
461309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
461409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
461509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
461609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
461709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
461809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
461909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
46204a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
462109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
462209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
462309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
462409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
462509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
462609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
462709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
462809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
462909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
463009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
463109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
463209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
463309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
463409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
463509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
463609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
463709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
463809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
4639370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX add LOOPRET support */
464009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
464109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
464209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
464309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
464409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
464509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
464609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
464709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
464809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
464909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
465009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
465109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
465209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
465309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
465409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
465509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
465609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
465709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
465809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
465909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
46604a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
466109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
466209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
466309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
466409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
4665a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4666a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4667a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4668cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
4669cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
4670cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4671cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
4672cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
4673cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4674cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4675cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
4676cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
4677cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4678cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
4679cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4680cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4681cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4682cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
4683cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
4684cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
4685cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4686c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
4687cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
4688cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
4689cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
4690cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
46919b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
4692cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
4693cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
4694cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
4695cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
4696cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4697cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4698cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
4699cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4700cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
4701cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4702cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4703cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4704cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4705c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
4706cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4707cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
4708cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
4709cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4710cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4711cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
4712cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
4713cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
4714cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
4715cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
4716cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
4717cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
4718cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
4719cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
4720cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
472298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
4723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
47240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
4725df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
4726370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX:
4727df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
4728df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
4729df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
4730df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
4731df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
473242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
473336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
4734460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
4735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
4736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
4737cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4738cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
473957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
4740dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
4741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
4742d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
4743be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
4744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
4745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
4746b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
4747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47543af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
4755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47563af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4757df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
47587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
47594558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
4760a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
47610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
4762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
4765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4766e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
476788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
47683af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
47693af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
47704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
4771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47760d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
4777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47780d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
477988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
4780d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
47810d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
4782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4783b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
478413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
4785b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
4786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47929f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
4793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4794de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4795de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47960d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
479787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
479892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4799c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
4800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4802cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4803ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
480409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
4805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
4806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
4810a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
4811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4817c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
4818cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
48190ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
4820d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
4821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4823c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
4824c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
48254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
4826cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
4827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48281d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
48291d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
483009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
4831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
483309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
4834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
483509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
4836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4852094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
4853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
4854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4856bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
4857332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
4858c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4859c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
48605893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
4861c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
4862d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
48630196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
4864c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
48659a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
4866c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
48674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
4868c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
4869c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
4870c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
48714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
4872850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
4873c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
4874c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
4875d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
48767383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
4877c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
4878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4882cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4883cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4884cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4885cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4886cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4887cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4888cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4889cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4890cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4891cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4892cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4893cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
48949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
48959b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
48966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
489742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
4898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
490050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
490150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
490298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
490350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
490450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
490550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
49068ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
490750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
4908112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
490950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
491050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
491150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
491250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
491350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
491450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
491550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
491650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
491750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
491850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
491950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
492050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
492150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
492350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
492650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
492950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4931df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
493250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
493350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
493450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
493550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
493650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
493750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
493950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
494150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
494250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
494350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
494450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
494550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
495150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
495350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
495450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
495550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
495650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
495813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
495950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
496050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
49677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
49717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
49727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4973c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
49747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
49777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
49787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
49797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
49807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
49817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
49847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
49857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
49867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4991608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
4992cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
49937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
4994d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
49957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
49967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4997cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
4998cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
49994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5000cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
50017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50021d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
50031d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
50047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
50057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
50087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
50107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
50127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
50187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
50277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
50287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
50297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
503060bf0f05b472e66bf1175fcec7a274dab6f7e2a3Vadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
5031332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5032cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5033cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5034cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5035cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5036d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5037cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
503860bf0f05b472e66bf1175fcec7a274dab6f7e2a3Vadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans},
5039b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
5040cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
50414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5042cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5043cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5044cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
50454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
50469b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
5047cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5048cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5049d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
50507383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5051cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
50527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5056cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
5057cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
5058cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5059cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5060cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5061cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5062cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5063cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5064cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5065cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
5066cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5067cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
50689b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
50699b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
50706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
507142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
50727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
50747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
50757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
50767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
50777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
50787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
50797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
50807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
50817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
50827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
50837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
50847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
50857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
50867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
50877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
50887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
50897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
50907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
50917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
50927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
50937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
50947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
50957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
50977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
50997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
51007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
51037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
5105df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
51067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
51077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
51087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
51097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
51107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
51117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
51137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
51157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
51167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
51177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
51187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
51197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
51257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
51277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
51287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
51297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
51307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
513213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
51337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
51347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
513550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
513650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
513750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
513850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
513950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
514052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
514150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
514250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
514350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
514450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
514550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
514650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
5147c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
514850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
514950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
515050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
5151ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
515250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
515350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
515450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
515550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
515650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
515750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
515850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
515950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
516050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
516150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
516250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
516350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
516450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5165f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
5166cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
51670ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
5168f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
516950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
517050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5171f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
5172f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
517329cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
5174cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
517550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
51761d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
51771d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
517850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
517950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
518050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
518150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
518250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
518350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
518450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
518550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
518650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
518750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
518850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
518950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
519250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
519950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
520050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
520150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
520250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
520350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5204f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
520529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
5206cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
5207cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
5208f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
5209f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
5210f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
5211f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
5212f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
5213f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
5214f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
521529cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
5216f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
5217f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
5218f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
521929cf90b4148ca8b625215644ef8d65a83815db11Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
5220d01e16639153df9f615993c25b98d5b04fb0f0a4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, cayman_mul_int_instr},
5221f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5222f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5223f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5224f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5225f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
522650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
522750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
522850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
522950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5230cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
5231cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
5232cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5233cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5234cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5235cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5236cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5237cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5238cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5239cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
5240cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5241cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5242f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
52439b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5244f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5245f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
524650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
524750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5248