r600_shader.c revision 5893e686b691013525cb2608c3d605be2d8ea471
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 "pipe/p_shader_tokens.h"
24f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák#include "tgsi/tgsi_info.h"
25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h"
26de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h"
2733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h"
28de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h"
299c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h"
30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h"
31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
32077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet#include "r600_formats.h"
33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h"
3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
37843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano#include <byteswap.h>
38843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano
397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie/* CAYMAN notes
407779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieWhy CAYMAN got loops for lots of instructions is explained here.
417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie-These 8xx t-slot only ops are implemented in all vector slots.
437779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMUL_LIT, FLT_TO_UINT, INT_TO_FLT, UINT_TO_FLT
447779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops, with all four
457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieslots expecting the arguments on sources a and b. Result is
467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliebroadcast to all channels.
477779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieMULLO_INT, MULHI_INT, MULLO_UINT, MULHI_UINT
487779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThese 8xx t-slot only opcodes become vector ops in the z, y, and
497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliex slots.
507779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieEXP_IEEE, LOG_IEEE/CLAMPED, RECIP_IEEE/CLAMPED/FF/INT/UINT/_64/CLAMPED_64
517779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieRECIPSQRT_IEEE/CLAMPED/FF/_64/CLAMPED_64
527779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSQRT_IEEE/_64
537779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieSIN/COS
547779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe w slot may have an independent co-issued operation, or if the
557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieresult is required to be in the w slot, the opcode above may be
567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlieissued in the w slot as well.
577779f6d1dffde2c0501e44adc342e52803de08d4Dave AirlieThe compiler must issue the source argument to slots z, y, and x
587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie*/
597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
60a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
611235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
621235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
64843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	uint32_t *ptr;
65843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	int	i;
661235becaa1cf7e29f580900592563c3329d326deJerome Glisse
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
696101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		shader->bo = (struct r600_resource*)
706101b6d442b06a347c001fe85848d636ab7df260Marek Olšák			pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE, rshader->bc.ndw * 4);
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
731235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
746101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->buf, rctx->ctx.cs, PIPE_TRANSFER_WRITE);
75d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		if (R600_BIG_ENDIAN) {
76d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			for (i = 0; i < rshader->bc.ndw; ++i) {
77d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
78d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			}
79d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		} else {
80d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
81843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		}
826101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		rctx->ws->buffer_unmap(shader->bo->buf);
831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
841235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
851235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
874f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
881235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
891235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
901235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
911235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
921235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
931235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
944f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
951235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
961235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
971235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
991235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse
106eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader);
1073b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
108eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
110052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse
114c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
115c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
116c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
117c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
118052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
119052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
120052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
121eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		tgsi_dump(shader->tokens, 0);
122543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
123543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		if (shader->so.num_outputs) {
124543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			unsigned i;
125543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			fprintf(stderr, "STREAMOUT\n");
126543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			for (i = 0; i < shader->so.num_outputs; i++) {
1272449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				unsigned mask = ((1 << shader->so.output[i].num_components) - 1) <<
1282449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák						shader->so.output[i].start_component;
129543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				fprintf(stderr, "  %i: MEM_STREAM0_BUF%i OUT[%i].%s%s%s%s\n", i,
130543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					shader->so.output[i].output_buffer, shader->so.output[i].register_index,
1312449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        mask & 1 ? "x" : "_",
1322449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 1) & 1 ? "y" : "_",
1332449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 2) & 1 ? "z" : "_",
1342449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák				        (mask >> 3) & 1 ? "w" : "_");
135543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
136543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
137052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
138eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	r = r600_shader_from_tgsi(rctx, shader);
1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1434a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_build(&shader->shader.bc);
1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
1461235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
1471235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
148052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
1494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_dump(&shader->shader.bc);
150052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
151052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
152afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1541235becaa1cf7e29f580900592563c3329d326deJerome Glisse
15569251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
156ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
1576101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&shader->bo, NULL);
1584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_clear(&shader->shader.bc);
159eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
160eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	memset(&shader->shader,0,sizeof(struct r600_shader));
161ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
162ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
1662b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
1672b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
169a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
170a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
171a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
172a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
173a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
174a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
175a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
176a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
1782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
1792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
1802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
1812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
1822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
1832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
1842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
1854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode				*bc;
1862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
18740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
188cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
189cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
190e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
191fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
196725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					face_gpr;
197725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int					colors_used;
1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
20842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
222c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
223a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
228a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2318260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2328260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
23847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
245fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
24650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
24750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
2484a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
271fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
2744a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
282fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
2964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
30050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
3017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
30321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
30421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0;
31221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
31421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
31521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
31721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
31921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
32021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
32121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
32221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
32321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
32421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
32521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
32621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
32721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
32821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
3297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3300a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
3310a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
3450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
3460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
3470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
3500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
3510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
3520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
3540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
3550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
3560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
3570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
3580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
3590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
3600a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3610a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
3625b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3635b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
3835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
3845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
3865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
3875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
3885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
3895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
3905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
3925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
3935b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
394725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
395725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
396725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
397725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
398725a820b926575265e6790601a0defd9c30947dcVadim Girlin
399725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
400725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
401725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
402725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
403725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
404725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
405725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
406725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
407725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
408725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
409725a820b926575265e6790601a0defd9c30947dcVadim Girlin
410725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
411725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
412725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
413725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
414725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
415725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
416725a820b926575265e6790601a0defd9c30947dcVadim Girlin
417725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
418725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
419725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
420725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
421725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
422725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
423725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
424725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
425725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
426725a820b926575265e6790601a0defd9c30947dcVadim Girlin
427725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
428725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
429725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
430725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
431725a820b926575265e6790601a0defd9c30947dcVadim Girlin
432725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
433725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
434725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
435725a820b926575265e6790601a0defd9c30947dcVadim Girlin
436725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
437725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
438725a820b926575265e6790601a0defd9c30947dcVadim Girlin
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
44072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
44396bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
44472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
4505b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
45135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4528a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
453024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
454725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
455725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->shader->input[i].name == TGSI_SEMANTIC_FACE)
456725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
457725a820b926575265e6790601a0defd9c30947dcVadim Girlin			else if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR)
458725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
459725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
460725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, i);
461725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
462725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
46450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
4705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
471024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
47235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
47391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
47491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
47591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
47691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
47791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
47891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
47991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
48091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
48191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
48291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
48391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
48733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
48847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
49096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
491c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
492c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
4934a47662beaa2092447939db7880531fb706afeddMarek Olšák			struct r600_bytecode_alu alu;
4944a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
49596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
496c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
497c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
498c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
49996bbc627f369c0100b950f81531b1fe9ef586c34Christian König
50096bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
50196bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
50296bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
503c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
50496bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5054a47662beaa2092447939db7880531fb706afeddMarek Olšák			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
506c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
507c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
50839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
50939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
51572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
51672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
517be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
518be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
519be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
520be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
521be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
5227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
523fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
524fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
525fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
526fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
527fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
528fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
529fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
530fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
531fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
532fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
533fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
534fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
535fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
536fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
537fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
538fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
539fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
543fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
544fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
545fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
546fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
547fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
549fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
550fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
551fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
552fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
553fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
555fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
556fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
5691fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
5701fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
5711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
5721fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
5731fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
5741fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
5751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
5761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
5771fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
5781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
5791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
58096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
5821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
5831fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
5841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
5851fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
5861fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
5871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
5884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
5891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
5901fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
5911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
5921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
5931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
5941fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
59596bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
59639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
59739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
59839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
59939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
60039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
60139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
60239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
60339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
60439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
60539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
60639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
60739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
60839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
609c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
6101fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
6111fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
6121fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
6131fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
6141fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
6151fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
6161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
617077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
618077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
6194a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
620077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
621077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
622077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
623077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
6244a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
625077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
626077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
627077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
628077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
6298e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
630077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
633077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
634077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
635077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
636077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
637077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6384a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
639077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
640077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
641077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
642077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
6438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
644077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
645077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
646077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
647077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
648077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
649077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
650077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
651077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
652077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
653077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
654077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
655077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
656077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
657077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
658077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
659d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
660077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6614a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
662077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
663077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
664077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
665077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
666077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6677687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
6687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
6697687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6704a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
6717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
6727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
6767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
680077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
681077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
682077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
683077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
684077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
685077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
686077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
687077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
688077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
689077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
690077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
691077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
692077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
6937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
6947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
6954a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
6967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
6977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
6987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
6997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
7007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
7017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
7027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
7037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
7047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
7054a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
7067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
7077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
7087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
7097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
7107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
7117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
7127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
7157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
7167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
7177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
7187687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
7197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
7207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7214a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
7227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
7237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
7247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
7257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
7267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
7277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
7307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
7317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
7327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
7334a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
7347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
7357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
7367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
7377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
7387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
7397687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
7407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
7417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
7427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
7434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
7447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
7457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
7467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
7477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
7487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
7497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
7527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
7537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
754725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
755725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
756725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
757725a820b926575265e6790601a0defd9c30947dcVadim Girlin
758725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
759725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
760725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
761725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
762725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
763725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
764725a820b926575265e6790601a0defd9c30947dcVadim Girlin
765725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
767725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
768725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
770725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
771725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
772725a820b926575265e6790601a0defd9c30947dcVadim Girlin
773725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
774725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
775725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
776725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
777725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
778725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
779725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
780725a820b926575265e6790601a0defd9c30947dcVadim Girlin
781725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
782725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
783725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
784725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
785725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
786725a820b926575265e6790601a0defd9c30947dcVadim Girlin
787725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
788725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
789725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
790725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
791725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
792725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
793725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
794725a820b926575265e6790601a0defd9c30947dcVadim Girlin
795eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader)
79672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
797eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
798eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct tgsi_token *tokens = pipeshader->tokens;
799543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	struct pipe_stream_output_info so = pipeshader->so;
800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
8015555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
8034a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
804457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
806feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	int i, j, r = 0, pos0;
80772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
8104a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_init(ctx.bc, rctx->chip_class);
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
816f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
818725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
819725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
820725a820b926575265e6790601a0defd9c30947dcVadim Girlin
821725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
822725a820b926575265e6790601a0defd9c30947dcVadim Girlin
823eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) ||
824eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color));
825eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
826feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
827feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
829076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
830076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
831076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
832f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
833f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
834f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
836076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
837076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
838076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
839076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
85489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
8554a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
856f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
8574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
858f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
86089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
861fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
86284457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
8644d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_INPUT] + 1;
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
8664d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
867d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
86897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
86997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
87097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
871d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
8727728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
8738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
8744d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
8758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
877cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
878cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
8795555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
883de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
885cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
886cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
887cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
888cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
889cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
890cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
891cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
892cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
893cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
894cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
902725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
903725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
904725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
90591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
90691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
907725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
908725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
90991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
91091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
91191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
91291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
91391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
914725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
915725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
916725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
917725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
918725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
919725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
920725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
921725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
922725a820b926575265e6790601a0defd9c30947dcVadim Girlin
923725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
924725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
925725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
926725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
927725a820b926575265e6790601a0defd9c30947dcVadim Girlin
928725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
929725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
930725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
931725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
932725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
936be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
937be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
938be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
9391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
9417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
9427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
9437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
9447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
94589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
9467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
94789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
94850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
94950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
95050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
956725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
959eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
960457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
961eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
962eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* clamp color outputs */
963eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	if (shader->clamp_color) {
964eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		for (i = 0; i < noutput; i++) {
965eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			if (shader->output[i].name == TGSI_SEMANTIC_COLOR ||
966eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				shader->output[i].name == TGSI_SEMANTIC_BCOLOR) {
967eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
968eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				int j;
969eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				for (j = 0; j < 4; j++) {
9704a47662beaa2092447939db7880531fb706afeddMarek Olšák					struct r600_bytecode_alu alu;
9714a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
972eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
973eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					/* MOV_SAT R, R */
974eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
975eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.sel = shader->output[i].gpr;
976eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.chan = j;
977eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.write = 1;
978eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.clamp = 1;
979eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].sel = alu.dst.sel;
980eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].chan = j;
981eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
982eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (j == 3) {
983eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						alu.last = 1;
984eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					}
9854a47662beaa2092447939db7880531fb706afeddMarek Olšák					r = r600_bytecode_add_alu(ctx.bc, &alu);
986eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (r)
987eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						return r;
988eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				}
989eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			}
990eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		}
991eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	}
992eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
993543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
994543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
995543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
996543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
997543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
998543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
999543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1000543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1001543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1002543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1003543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
10042449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			if (so.output[i].start_component) {
10052449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   R600_ERR("stream_output - start_component cannot be non-zero\n");
10062449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
10072449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1008543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1009543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1010543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1011543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1012543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
10132449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			output.array_base = so.output[i].dst_offset;
1014543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1015543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1016543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1017543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.array_size = 0;
10182449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			output.comp_mask = (1 << so.output[i].num_components) - 1;
1019543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1020543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1021543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1022543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1023543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1024543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1025543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1026543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1027543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1028543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1029543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1030543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1031543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1032543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1033543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1034543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1035543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1036543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1037543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1038543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1039543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1040543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1041543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1042543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1043543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1044543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1045543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1046543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1047543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1048543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1049543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1050543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1051543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1052543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1053543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1054543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1055543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1056eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
1057feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	j = 0;
105891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
1059457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
106091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		memset(&output[i+j], 0, sizeof(struct r600_bytecode_output));
1061feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].gpr = shader->output[i].gpr;
1062feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].elem_size = 3;
1063feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_x = 0;
1064feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_y = 1;
1065feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_z = 2;
1066feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_w = 3;
1067feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].burst_count = 1;
1068feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].barrier = 1;
1069feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
107091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		output[i + j].array_base = i+j - pos0;
1071feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1072457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
107491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
107591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
1076feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 60;
1077feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
1078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
1079457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
108091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
108191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
108291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
1083feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
1084feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
1085457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
1086457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
108791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
108891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
108991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
109091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				/* array base for enabled OUT_MISC_VEC & CCDIST[0|1]_VEC
109191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				 * vectors is allocated sequentially, starting from 61 */
109291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				output[i + j].array_base = 61 + shader->output[i].sid
109391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					/* +1 if OUT_MISC_VEC is enabled */
109491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					+ shader->vs_out_misc_write
109591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					/* -1 if OUT_CCDIST0_VEC is disabled */
109691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					- (((shader->clip_dist_write & 0xF) == 0)? 1 : 0);
109791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
109891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				j++;
109991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				pos0++;
110091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				/* duplicate it as PARAM to pass to the pixel shader */
110191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				memcpy(&output[i+j], &output[i+j-1], sizeof(struct r600_bytecode_output));
110291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				output[i + j].array_base = i+j-pos0;
110391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
110491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
1105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
1109feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = shader->output[i].sid;
1110feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
11114f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
1112feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					for (j = 1; j < shader->nr_cbufs; j++) {
11134a47662beaa2092447939db7880531fb706afeddMarek Olšák						memset(&output[i + j], 0, sizeof(struct r600_bytecode_output));
1114feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].gpr = shader->output[i].gpr;
1115feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].elem_size = 3;
1116feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_x = 0;
1117feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_y = 1;
1118feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_z = 2;
1119feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_w = 3;
1120feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].burst_count = 1;
1121feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].barrier = 1;
1122feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].array_base = shader->output[i].sid + j;
1123feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1124feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1125feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
112660302f83e2344195f9a1c37215def09fa9c45ff9Marek Olšák					j = shader->nr_cbufs-1;
1127feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
11285f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
1129feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
1130feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 2;
1131feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 7;
1132feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
1133feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
113439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
1135feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
1136feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 7;
1137feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 1;
1138feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
1139feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1142de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1148de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
115072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
1151457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
1152feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	noutput += j;
1153457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
1154457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
1155457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
1156457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
1157457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
1158457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
1159457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
1160457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
11624a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&output[i], 0, sizeof(struct r600_bytecode_output));
1163457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
1164457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
1165a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_x = 7;
1166a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_y = 7;
1167a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_z = 7;
1168a2bcaba1cdc4c06868d95c613a28584743471361Vadim Girlin			output[i].swizzle_w = 7;
11698ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
1170457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
1171457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
1172457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
11737e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1174457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
1175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1176c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1177481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
1178481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
11794a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&output[0], 0, sizeof(struct r600_bytecode_output));
1180481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
1181481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
1182481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
1183481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
1184481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
1185481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
11868ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
1187481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
1188608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1189481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
1190a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1191481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
1192481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
1193457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1194457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
119589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
11967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
11977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
11987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1199457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1200b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1201b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1202a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1203c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1204c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1205457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1206457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
12074a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
12117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
121289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
12134a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
12147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12153b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1219cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1226f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1227f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
12364a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1237a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1238a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1239a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1240a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1241a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1242a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1243a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1244a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1245a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1246a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1247a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
12484a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1249f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1250f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1251f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1252f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1253f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
12544a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
12553efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
12563efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
12573efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
12583efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
125980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
126080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
126180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
12624a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
12647a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12657a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
127047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
127147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
12727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
12737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
12747a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1277dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1279dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1280d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1281d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1282dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1283d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1284d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1285d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1286dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1287dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1288dffad730df17983cfaef0808555a8c26cad0aa15Christian König
12899b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1290dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1291dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12924a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1293dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1294dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1296d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1297d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1298d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1299d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
13004a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
130180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1303d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1304d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
13064a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1308d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
13094a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
13104a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
13154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
13177a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
13184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
13197a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
13239b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
13264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1333d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1334d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
13359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1336d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1337d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1338d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1339d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
13409b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
13419b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
13429b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
13439b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
13449b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
13459b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1346d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1347d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1348cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1349cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1350cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1351cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1352cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1353cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1354cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1355cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1356cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1357cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1358cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1359cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1360cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1361cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1362cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1363cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1364cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1365cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1366cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1367cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1368cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1369cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1370cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1371cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1372cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1373cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1374cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1375cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1376cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1377cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1378cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
13797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
13807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
13817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
13834a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
13847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
13857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
13874a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
13897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
13904a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
13917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
13927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
13947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
13957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
13967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13974a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
13987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
13997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
14017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
14027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
14037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
140588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
140688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
140788f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
140888f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
14091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
141088f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
141196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
141296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
141396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
141496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
141596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
14164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
14184a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1419a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
142088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
142188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
142288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
142388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
142488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
142588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
14264a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
14277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1428921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
142988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1430a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
143196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1432ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
143388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
14344a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
143588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
143688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
143788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
14384a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1439a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
14407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
144188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
144288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
144388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
144488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
144588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
144688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
144788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
14484a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
144988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
145088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
145188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
14524a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1453a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
145488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
145588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
145688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
145788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
145888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
145988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
146088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
146188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
14627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1463921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
146488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1465921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1466ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
146796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
146889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1469a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1470a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
147196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
147296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
147396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
147496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
147596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
147696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
147788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
14784a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
147988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
148088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
148192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
148292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
148392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
14847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
14857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
14867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14874a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
14897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
14907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
14927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
14937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
14947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
14974a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
14997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
15007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
15057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
15067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
15077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
15097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
151592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
151692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
151792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15184a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
151992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1520dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
152192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
15221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
152392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
152492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
152588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
15264a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
152788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
152888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
152988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
153088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
153188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
153288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
153388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
153488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
15354a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
153688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
153788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
153888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
153988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1540be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1541be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1542be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1543be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
15444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1545a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1546be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1547be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
154880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1549be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
155088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
15514a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
155288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
155388f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
155488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
155588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
155688f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
155788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
155892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
155992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
156092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15614a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
15627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
156392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
156457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
156557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
156657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
156757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
15681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
156957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
157057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
157157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
157292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
157392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
157457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
157589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
15767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
15774a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
15797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
15827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
15837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
15847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
15857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
15867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
15877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
15887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
15894a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
15907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
15917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
15927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
15937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
15944a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
15967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
159792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
15987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
15997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
16007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16014a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
16027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
16037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
16047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
160557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
160692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
160792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
160857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
160989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
16107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
16114a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
16137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
16157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
16167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
16177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
16187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
16197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
16207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
16217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
16224a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
16237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
16247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
16257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
16267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
16274a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
16297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
163057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
16317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
16327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
16337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16344a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
16357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
16367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
16377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
163857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
163992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1640ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1641ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
16424a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1643ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1644ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1645ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
164680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1647ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1648ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1649ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1650ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1651ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1652ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
16534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1654ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1655ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1656ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1657ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1658ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1659ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
16604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1661ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1662ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1663ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
166480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1665ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1666ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1667ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1668ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1669ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1670ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
16714a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1672ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1673ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1674ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1675ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
167692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
167792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
167892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1679094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1680094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
16814a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1682094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1683094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1684094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
16854a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1686094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
16874502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1688094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
16894502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1690921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
16914502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
16924502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
16934502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
16944502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
16954502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
16964a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
16974502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1698094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1699094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1700094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
17014a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1702094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1703094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1704094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
17054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
17064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
17074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
17084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1709094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1710094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1711094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
17120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
17130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
17140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17154a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
17160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
17170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1718f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
17194a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1720f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
17214a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
1722f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1723f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
1724f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1725f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
1726f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
1727f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
1728f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1729f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
17304a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1731f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
1732f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
1733f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
17340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
17350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
17366a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
17376a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
17387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
17396a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
174089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
17417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
1742f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
17434a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1745f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
1746f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
1747f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
1748f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
17497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
17507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
17517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
17527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
17537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
17547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
17554a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
17567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
17577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
17587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
17597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
1760f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
17614a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1763f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
1764f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
17652fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
17662fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
17672fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
17687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
17694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
17707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
17717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
17727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
17730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
17746a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
17756a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
17760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
177786f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
17784a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1779a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
178086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
178186f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
17824a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
17834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
17840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
17850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
17860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
17870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
17880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
17894a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
17910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
17920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
179389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
17947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
17957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
17964a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
17987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
17997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
18007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
18027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
18057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
18064a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
18077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
18117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
18124a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
18147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
18157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
18167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
18177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
18197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
18207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
18217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1823abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
18248567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
18254a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18268567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
18278567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
18288567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
18298567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
18308567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
18314a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
18328567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
18338567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
18348567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
1835abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
18364a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1837abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
18384a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1839abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1840abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1841abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1842abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
18434a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1844abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1845abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1846abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1847abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
18484a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1849abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1850abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1851abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1852abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1853abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1854abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
18554a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1856abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1857abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1858abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
18590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
18600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
18610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
186242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
186342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
186442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
186642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
186742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
18684a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1869df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1870df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1871df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1872df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1873df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1874df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1875df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
187642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
18774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
18784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
187942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
188042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
188142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
188242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
18834a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
188442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
188542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
188642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
188742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
188842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
188942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1890a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
18917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
18927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18934a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1894a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
18957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
18967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
18974a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1899a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
19007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
190180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
19037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
19047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
19054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
19077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
19087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
19097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
19107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
19117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1912a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1913a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1914a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19154a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1916a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1917a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
19184a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1919a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1920a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
19214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
1922a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1923a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1924a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1925a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
19264a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1927a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1928a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1929a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1930a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1931a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1932a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
19337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
19347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
19357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
19374a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
19397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
19414a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
19434a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
19447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
19457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
19467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
19477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
19487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
19517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
19527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
19537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
19554a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
19574a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
19587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
19597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
19607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
19617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
19624a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
19637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
19647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
19657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
19677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
19684a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
19707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
19717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
19747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
19757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
19787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
19797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
19807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
19817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
19827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1983a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1984a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
19854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1986a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1987a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1988a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
19894a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1990a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
19914a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1992a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1993a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1994a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
19954a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1996a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1997a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1998a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
19994a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
200066f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
20014a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2002a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2003a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2004a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2005a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20064a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2007a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2008a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2009a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
20104a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2011a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2012a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2013a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2014a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2015a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20164a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2017a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2018a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2019a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2020a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2021a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
20224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2023332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2024332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2025332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
2026332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int i, r;
2027332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2028332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2029332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
20304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
20314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
20324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
20334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
20354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
20374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
20384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
20394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
20404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
20414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
20424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
20434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
20444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
20454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
20464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
20474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
20494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
20504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
20514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
20534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
20554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
20564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
20584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
20604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
20614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
20634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
20654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
20674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
20684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
20704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
20714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
20734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
20754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
20764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2077332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2078332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2079332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2080332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2081332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
20824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2083332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
20844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
20854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2087332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
20884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
20894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
20904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2091332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
20924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2093332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
20944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2095332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
20964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
20974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
20984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
20994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2101332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2103332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2106332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2107332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2109332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2111332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
21154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
21174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
21184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
21194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
21224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
21244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
21254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
21264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
21284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2129332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2130332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
21314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
21334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
21344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
21364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
21384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
21394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
21424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
21434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
21454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
21464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
21474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
21484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2151332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
21524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
21544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
21564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
21574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
21604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
21614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
21634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
21644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
21654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
21664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
21704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2171332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2172332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
21744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
2176332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
21784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
21794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
21804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
21824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp2;
21834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
21844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
21854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
21864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
21874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
21894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
21914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
2193332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2195332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2196332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp0;
21974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
2198332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2199332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2200332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp0;
22014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
22024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
22034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
22044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
22054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
22064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
22074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2208332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
22124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
22144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
22164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
22184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
22194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
22204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
22224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
22234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
22244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
22284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
22304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
22324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
22344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
22354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
22364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
22384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
22394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
22414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
22424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
22434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
22444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2245332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2246332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2249332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2250332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
22524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
22544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2255332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
22574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
22584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
22594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
22614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
22624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
22634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
22644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
22654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
22664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
22704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
2272332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2274332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
22764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
22774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
22784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
22804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 2;
22814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
22834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 0;
22844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
22884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
22904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2292332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2293332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
22944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2295332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2296332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
22984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
22994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
23014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2302332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
23034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2304332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2305332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2307332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2309332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2310332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
23114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2312332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2313332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
23164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2318332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2319332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
23204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2321332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2322332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
23244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
23264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2327332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
23304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
23344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
23354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
23364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
23374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
23384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
23404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
23414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
23424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
2344332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
23464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
23494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
23534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
23554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
23564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 0;
23574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
23584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
23594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
23604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
23624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
23634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
23644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
23664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
23684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
23714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
23744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
23754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 1;
23764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
23774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
23784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
23794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
23824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
23844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
23854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
23864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
23884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
23904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
23934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
23964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
23974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
23984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
23994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
24004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
24014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
24034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
24044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
24084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
24104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
2412332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2413332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
24144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2415332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2416332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
24184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
24194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
24204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
24214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
24224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
24234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
24244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2425332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
2429332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
24314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
24334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
24354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
24364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
24374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
24394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
24404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
24414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
24424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
24434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
24444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
24464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
24474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2450332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2451332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
2453332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
2455332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2457332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2458332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
24594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
2460332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2461332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
24634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
2464332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
24664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
24674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
24684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
24694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
24704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
24714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
24734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
24754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
24774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
24794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
24814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
24824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
24834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
24854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
24864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
24874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
24884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
24894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
24904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
24914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
24924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
24944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
24964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
24984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
25004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
25024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
25044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
25054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
25084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
25094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
25104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
25164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
25184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
25204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
25214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
25244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
25254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
25264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2529332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
25304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2531332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2532332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
25344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
25364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
25384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
25394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
2540332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
2552332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2555332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
2559332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
25784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
25814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2583332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2584332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
25894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
2590332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2593332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2594332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
26004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
26024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
26044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
26104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
26144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
26184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
26294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
26304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
26324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
26364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
26424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
26434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
2674332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
2675332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
2676332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
26784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
26814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
26834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
26844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
26854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
26864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
26884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
26894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
26904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
26914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
26934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
26944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
26954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
26964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2698a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlinstatic int tgsi_f2i(struct r600_shader_ctx *ctx)
2699a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin{
2700a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2701a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	struct r600_bytecode_alu alu;
2702a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	int i, r;
2703a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2704a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
2705a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2706a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	for (i = 0; i < 4; i++) {
2707a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (!(write_mask & (1<<i)))
2708a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			continue;
2709a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2710a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2711a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC);
2712a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2713a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.dst.sel = ctx->temp_reg;
2714a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.dst.chan = i;
2715a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.dst.write = 1;
2716a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2717a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2718a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (i == last_inst)
2719a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			alu.last = 1;
2720a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
2721a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (r)
2722a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			return r;
2723a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	}
2724a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2725a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	for (i = 0; i < 4; i++) {
2726a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (!(write_mask & (1<<i)))
2727a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			continue;
2728a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2729a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2730beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin		alu.inst = ctx->inst_info->r600_opcode;
2731a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2732a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2733a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2734a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
2735a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		alu.src[0].chan = i;
2736a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2737a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (i == last_inst)
2738a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			alu.last = 1;
2739a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
2740a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin		if (r)
2741a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin			return r;
2742a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	}
2743a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
2744a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	return 0;
2745a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin}
2746a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin
27476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
27486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
27496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
27506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
27516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
27526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
27536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
27546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
27566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
27576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
27586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
27596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
27626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
27646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
27656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
27666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
27686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
27696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
27716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
27726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
27736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
27746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
27756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
27766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
27786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
27796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
27806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
27816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
27846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
27856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
27866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
27886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
27906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
27916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
27926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
27936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
27956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
27966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
27976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
27986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
27996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
28006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
28016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
28026b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
280342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
280442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
280542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
280642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
280742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
280842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
280942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
281042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
281142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
281242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
281342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
281442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
281542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
281642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
281742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
281842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
281942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
282042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
282142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
282242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
282342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
282442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
282542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
282642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
282742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
282842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
282942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
283042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
283142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
283242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
283342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
283442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
283542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
283642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
283742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
283842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
283942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
284042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
284142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
284242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
284342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
284442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
284542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
284642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
284742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
284842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
284942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
285042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
285142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
285242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
285342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
285442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
285542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
285642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
285742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
285842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
285942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
286042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
286142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
286242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
286342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
28646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
28656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
28660d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
28670d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
28680d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
28694a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2870921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
28710d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28720d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
28730d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
28744a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2875a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
28760d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
2877cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
28780d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
2879cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
28800d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28814a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2882921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
28834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
28840d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28850d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
28860d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
28874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
28880d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
28890d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
28900d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
28910d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28920d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
28930d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
28944a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2895a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
28960d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
289780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
28980d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28990d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2900cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
29010d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
29020d48925a56ad4fb253386110b545abda82a25464Dave Airlie
2903921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
29040d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
29050d48925a56ad4fb253386110b545abda82a25464Dave Airlie
29060d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
2907cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
29080d48925a56ad4fb253386110b545abda82a25464Dave Airlie
29090d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
29100d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
29114a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
29120d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
29130d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
29140d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
29150d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
29160d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
29170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
2918cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
2919cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
29204a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2921cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
2922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2923cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
29244a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2925cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
2926a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
29276c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
2928cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
2929a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
293080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
2932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
2933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
2934cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
2935cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
2936cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
29374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2938cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
2939cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
2940cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
2941cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
2942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
2943cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
2945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29474a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
2949dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
29517be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
29527be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
29537be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
29547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
29554a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
29584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
2959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
29607be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
296180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
2963cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
2964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
29657be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
2967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
29684a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
2970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
2971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
29727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
2973cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
2974cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2975cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
2976cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
2977cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29784a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2979cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
2980cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
29824a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2983cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
2984cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
29854a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
2986cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
2987a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
298880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2989cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
2990a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
2991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
2992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
2993cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
2994cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
2995921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
2996cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
2997cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
2998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2999cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
3000cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3001921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3002cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3003cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3004cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3005e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3006e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3007e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3008e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3009e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3010e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3011e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3012cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3013cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
30184a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
30227be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
30256415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
30266415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
30276415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
30286415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
30306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
30316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
30326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
30336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
30346415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
30356415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
30366415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
30376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30386415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
30396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
30406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
304133241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
304233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
304396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
304433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30454a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
30464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3047641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
304840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3049bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3050da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3051da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
30526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
305378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
305413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
30551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	u8 offset_x = 0, offset_y = 0, offset_z = 0;
3056641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
30576415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3058641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
30591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
30601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
30611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
30621d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
30631d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
30641d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
30651d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
30661d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
30671d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
30681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
306913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
307013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
307113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
307240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
307340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
30744a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
307540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
307640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
307740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
307840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
307940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
308040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
308140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
308240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
308340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
308440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
308540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
308640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
308740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
30884a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
308940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
30904a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
309140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
309240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
309340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
309440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
309540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
30964a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
309740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
309840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
309940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
310013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
310140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
310240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
310340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
310440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
310540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
310640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
310740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
310840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
310940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
311040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
311140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
311240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
311340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
311440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
311540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
311640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
31174a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
311840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
311940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
312013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
312113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
31227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3123b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
312489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
31257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
31267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
31274a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
31294a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
31317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
31327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
31337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
31347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
31357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
31367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
31374a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
31387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
31397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
31407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
31417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
31427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
31437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
31444a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
31464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
31477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
31487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
31497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
31507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
31517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
31524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
31537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
31547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
31557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
31569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3157b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
31584a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3159a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3160b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
31617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
31624a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3163b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3164b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3165b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
31664a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3167b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3168b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3169b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
31704a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3171a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3172921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3173b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3174b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3175b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3176b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3177b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
31784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3179b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3180b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
318178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3182b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3183bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3184bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3185bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
31860e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
31870e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3188bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3189bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3190bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
31914a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3192a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
31934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
31944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3195bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3196bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3197bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3198bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3199bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
32004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3201bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3202bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3203bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3204bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3205bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
320689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
32077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
32084a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
32107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
32117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
32127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
32137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
32147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
32157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
32167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
32177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
32187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
32194a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
32207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
32217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
32227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
32237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
32244a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
32267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
32277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
32287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
32297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
32307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
32317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
32327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
32334a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
32347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
32357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
32367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
32377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3238bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3239bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
32407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3241bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
32424a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3243a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3244bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3245bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3246bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3247bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3248bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3249bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
32507ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3251bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3252bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3253a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3254bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3255bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3256bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3257bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3258bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
32594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3260bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3261bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3262bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
32634a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3264a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3265bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3266bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3267bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3268bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3269bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3270bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
32717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3272bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3273bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3274a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3275bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3276bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3277bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3278bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3279bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3280bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
32814a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3282bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3283bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3284bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
328578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3286bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
3287bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3288bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
328978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
3290b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
32914a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3292a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
32934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3294b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3296b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
3297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
3298b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
32994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3300b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3301b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3302b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
330378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3305b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
33067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3307bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
3308929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3309929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
33106b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
3311929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
3312929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
3313de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
3314de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
3315de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
3316de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3317de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
3318de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
3319de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3320c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
3321c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
3322c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
3323de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
3324de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
3325de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3326de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
3327de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
332833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
33294a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
3330bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
33316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
33326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
3333077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
3334641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
33356c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
33369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
33379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
33389d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
33399d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
334078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
334178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
334278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
334378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
334478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
334578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
334678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
334778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
334878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
334978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
3350244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
335178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
33529a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
3353bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
3354bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
3355bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
3356bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
3357bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
3358bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3359bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
33606b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
33616b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
336201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
336301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
336401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
33656b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
33666b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
3367bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
33681d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
33691d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
33701d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
337169d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
3372929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
3373929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
3374929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
3375929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3376929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
33776b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
3378929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
3379929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
3380929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
338178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
3382929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
3383929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
3384929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
3385929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
3386929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
3387929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
3388929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
3389929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
3390929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
3391929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
3392929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
3393929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
3394929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
3395929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
3396929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
3397929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
3398929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
3399bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
34004a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
3401bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
3402bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
3403bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3404bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
3405bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
340633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
340733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
3408b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
3409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
3410b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
34114a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3412dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3413b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
3414b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
3415b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3416c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
34171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
3418c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
3419c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3420c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
3421c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
34224a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3423c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
34244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
34254a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3426c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
342780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3428c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
3429c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
3430c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
3431c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
34324a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3433c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
3434c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
3435c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
3436c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
3437c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
3438c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
3439b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
3440dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3441dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3442dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3443dffad730df17983cfaef0808555a8c26cad0aa15Christian König
34444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3445a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
3446921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3447b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
34484a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
3450b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
3451b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3452dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3453b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3454b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
3455b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
34564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3457b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3458b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3459b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3460b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3461b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
3462dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3463dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3464dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3465dffad730df17983cfaef0808555a8c26cad0aa15Christian König
34664a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3467a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3468b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
3469b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
34704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3471b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
3472b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3473dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3474b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3475b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
3476b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
34774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3478b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3479b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3480b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3481b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3482b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
3483dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3484dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3485dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3486dffad730df17983cfaef0808555a8c26cad0aa15Christian König
34874a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3488a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3489b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
34904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
34914a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3492b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
3493b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
3494dffad730df17983cfaef0808555a8c26cad0aa15Christian König
349580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3496b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3497dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3498b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3499b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
35004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3501b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3502b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3503b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3504dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
3505b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
3506b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
350787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
350887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
350987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35104a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
351187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
3512dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
351387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
35147be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
35157be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
35167be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
351787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
35184a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3519a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
35204a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
35214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
35224a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
352380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
352487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
352587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
352687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
35277be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
352887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
35294a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
353087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
353187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
35327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
353387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
353487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
353587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
35360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
35370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
35380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35390e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
35400e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
35414a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
35420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
35430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
35440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
35460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
35470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
35494a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3550a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
35510e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
35524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
35534a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
35540e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
35550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
35560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
35570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
35580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
35590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
35600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
35620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
35630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
35640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
35660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
35674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
35680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
35690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
35700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
35710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
35734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3574a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
35750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35760e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
35774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
35784a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
35790e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
35800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
35810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
35820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
35830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
35840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
35850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
35870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
35880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
35890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
35910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
359280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
359380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
35940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
35950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
35960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
35970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
35980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
35994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
36000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
36010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
36020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
36030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
36040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
36050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
36060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
36070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
360836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
360936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
361036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36114a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
361209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
36137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
361436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
361536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
361636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
36174a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
361836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3619a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
36204a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
362136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
362236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
362336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
362436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
362536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
36264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
362736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
362836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
362936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
363089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
36317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
36327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
36337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
36347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
363536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
36367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
36377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
36387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
36397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
36407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
36417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
36424a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
36437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
36447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
36457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
36467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
36477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
36487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
36497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
36507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
36517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
36527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
36547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
36554a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
36567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
36577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
36587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
365936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
36607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
366136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
366236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
36634a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
366436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3665a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
36664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
366736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
366836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
3669b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
3670b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3671b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
3672b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
3673b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
367436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
367536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
367636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
367736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
367836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
36794a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
368036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
368136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
368236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
368336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
368436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
368536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
368689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
36877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
36884a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
36904a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
369136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
36927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
36937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
36947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
36957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
36967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
36977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
369836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
36994a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
37007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
37017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
37027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
37037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
37044a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
37064a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
370736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
37097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
37117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37144a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
37157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
37167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
37177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
371836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
371936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
372036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
372136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
37224a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
372336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3724a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
372536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
372636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
372736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
372836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
372936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
373036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
373136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
37324a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
373336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
373436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
373536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
373636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
373736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
373887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
3739460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
3740460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
3741460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37424a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3743460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
37447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
3745460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3746f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
3747460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
374889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
37497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
37504a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3751460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
37527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
37534a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
37544a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
37557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
37577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
37587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
37597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
37607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
37617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
37624a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
37637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
37647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
3766460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
37677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
37684a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
37714a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
37724a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
37757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
37784a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
3782460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3783460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
3784460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
3785460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
3786460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3787460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3788460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
3789460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3790460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3791460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
37924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3793460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3794460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3795460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3796460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3797f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
3798460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
3799460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
380089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38024a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
380396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
38054a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
38064a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
380796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
38117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38154a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38204a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
38234a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
38244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
38257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
38287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38314a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
383596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38364a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
383796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
383896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
383996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
384096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
384196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
384296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
384396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
384496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
384596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
384696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
384896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
384996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
385096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
385189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38534a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
38567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
38577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
38617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
386496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38654a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38704a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
38727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
387496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
387996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
388496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
388589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38874a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
38917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
38957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38994a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39044a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
39077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
390896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
39117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
391396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39144a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
391896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39194a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
392096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
392196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
392296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
39244a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
392596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
392696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
392796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
3928460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3929460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3930460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
3931460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3932460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3933460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3935460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3936460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3937460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3938460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3939f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
3940460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
394189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39434a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3944460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
39464a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
39474a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
3948460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
3955460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39564a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39614a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
39644a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
39654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
39667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
39707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
39717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39724a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
3976460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3977460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3978460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
3979460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
39804a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3981460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3982460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3983460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
3984460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
3985460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3986460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3987460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
3988460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3989460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3990460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39914a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3992460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3993460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3994460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3995460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3996460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
3997460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
3998460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
399998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
400098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
400198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
40024a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
400398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4004a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
40054a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
400698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
400752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
400852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
400952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
401052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
401152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
401252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
401352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
40149b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
40158e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
40169b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
401752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
401852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
401952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
402052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
402152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
40228e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
402398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
40248e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
40258e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
40264a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
402798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
402898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
40298e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
40308e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
403198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
403298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
403398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
403447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
403547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
40364a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
403747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4038a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
40397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
40407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4041077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4042077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
40434a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40448e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4045077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4046077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4047077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
40484a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4049077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
4050077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4051077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4052077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
40538e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
40548e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4055077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4056077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4057077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
40584a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4059077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
40607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
40617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4062077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4063077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
40644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40658e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4066077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4067077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4068077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
40694a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4070077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
40717ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
40729b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
40738e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
40748e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
40758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40768e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
40778e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
40788e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
40798e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
40808e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
40818e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
40829b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
40837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
40847ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
40857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
40867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
40877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
40888e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
408947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
409047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
409147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
409257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
409357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
409457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
40954a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
409657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
409757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
409857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
40994a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
410057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4101a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
410280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
41037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
41047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
410557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
410657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
41074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
410857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
410957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4110a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
411157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
411257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
41134a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
411457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
411557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
411657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
41174a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
411857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
411957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
412057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
412157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
412257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
412357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4124a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4125a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
41264a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4127a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4128a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
41294a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4130a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4131a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
4132a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4133a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4134a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4135a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4136a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
41374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4138a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4139a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
41407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4141a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4142a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
41434a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4144a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4145a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4146a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4147a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4150a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
41512bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
41522bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
41532bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
41542bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
41552bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
41564f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
41572bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
41584f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
41592bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
41602bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
41612bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
41622bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
41634f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
41642bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
41652bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
41664f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
41672bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
41682bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
41692bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
41702bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
41712bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
41722bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
41732bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
41744a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
41758813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
41768813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
41778813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
41782bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4179a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4180a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4181a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
418209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4183a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
418409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
418509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
418609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
418709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
418809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
418909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
419009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
419109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
419209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
419309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
419409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
419509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
419609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
419709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4198a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
419909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
420009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
420109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
420209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
420309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
420409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
420509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
420609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
420709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
420809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
420909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4210a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4211a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4212a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
421309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
421409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
421509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
421609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
421709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
421809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
421909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
42207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
422109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
422209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
422309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
422409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
422509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
422609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
422709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
422809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
422909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
423009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
423109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
423209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
423309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
423409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
423509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
423609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
423709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
423809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
423909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
424009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
424109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
424209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
424309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
424409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
42454a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
42464a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
424709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
424809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
424909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4250a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
425109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
425209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4253a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
425409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
425509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
425609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
425709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
425809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
425909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
426009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
426109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
426209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
426309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
426409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
426509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
426609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
426709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
426809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
426909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
427009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
427109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
427209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
427309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
42744f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
427509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
427609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
427709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
427809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
427909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
428009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
42814f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
428209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
428309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
428409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
428509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4286a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
428709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
428809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
428909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
429009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
429109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
429209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
429309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
42947ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
429509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
429609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
429709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
429809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
429909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
430009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
430109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
430209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
430309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
430409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
430509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
430609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
430709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
430809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
430909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
43104a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
431109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
431209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
431309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
431409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
431509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
431609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
431709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
431809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
431909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
432009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
43218b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
432209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
43234a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
432409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
432509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
432609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
432709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
4328a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4329a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4330a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4331a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
4332a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
43334a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
4334a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
4335a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
433609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
4337a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
4338a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4339a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4340a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4341a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
4342a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
4343a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
4344a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
4345a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
4346a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
4347a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
4348a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4349a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
4350a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
4351a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
4352a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
435309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
4354a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
435509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
435609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
435709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
435809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
435909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
436009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
436109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
436209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
43634a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
436409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
436509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
4366a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
436709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
436809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
436909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
437009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
437109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
437209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
437309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
437409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
437509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
43764a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
437709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
437809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
437909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
438009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
438109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
438209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
438309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
438409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
438509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
438609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
438709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
438809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
438909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
439009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
439109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
439209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
439309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
439409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
439509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
439609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
439709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
439809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
439909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
440009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
440109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
440209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
440309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
440409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
440509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
440609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
440709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
440809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
440909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
441009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
441109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
441209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
441309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
441409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
441509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
44164a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
441709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
441809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
441909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
442009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
442109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
442209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
4423a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4424a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4425a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4426cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
4427cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
4428cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4429cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
4430cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
4431cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4432cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4433cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
4434cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
4435cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4436cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
4437cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4438cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4439cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4440cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
4441cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
4442cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
4443cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4444c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
4445cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
4446cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
4447cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
4448cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
44499b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
4450cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
4451cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
4452cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
4453cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
4454cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4455cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4456cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
4457cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
4459cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4460cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4462cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4463c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
4464cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4465cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
4466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
4467cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4468cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
4470cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
4471cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
4472cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
4473cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
4474cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
4475cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
4476cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
4477cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
4478cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
448098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
4481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
44820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
4483df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
4484df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
4485df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
4486df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
4487df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
4488df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
4489df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
449042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
449136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
4492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
4493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
4494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
4495cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4496cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
449757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
4498dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
4499de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
4500d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
4501be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
4502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
4503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
4504b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
4505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45123af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
4513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45143af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4515df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
45167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
45174558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
4518a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
45190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
4520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45227a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
4523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4524e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
452588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
45263af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
45273af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
45284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
4529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45340d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
4535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45360d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
453788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
4538d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
45390d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
4540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4541b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
454213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
4543b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
4544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45509f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
4551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45540d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
455587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
455692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4557c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
4558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4561ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
456209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
4563a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
4564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4567a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
4568a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
4569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4575c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
4576cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
45770ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
4578d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
4579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4581c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
4582c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
45834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
4584cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
4585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45861d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
45871d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
458809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
4589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
459109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
4592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
459309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
4594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4610094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
4611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
4612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4614bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
4615332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
4616c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4617c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
46185893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
4619c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
4620d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
4621c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2},
4622c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
46239a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
4624c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
46254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
4626c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
4627c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
4628c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
46294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
4630850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
4631c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
4632c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
4633d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
46347383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
4635c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
4636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4640cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4641cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4642cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4643cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4644cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4645cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4646cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4647cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4648cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4649cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4650cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4651cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
46529b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
46539b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
46546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
465542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
4656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
465850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
465950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
466098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
466150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
466250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
466350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
46648ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
466550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
4666112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
466750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
466850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
466950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
467050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
467150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
467250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
467350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
467450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
467550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
467650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
467750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
467850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
467950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
468050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
468150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
468250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
468350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
468450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
468550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
468650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
468750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
468850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4689df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
469050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
469150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
469250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
469350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
469450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
469550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
469650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
469750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
469850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
469950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
470050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
470150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
470250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
470350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
470950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
471050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
471150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
471250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
471350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
471450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
471550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
471613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
471750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
471850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
47257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
47297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
47307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4731c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
47327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
47357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
47367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
47377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
47387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
47427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
47437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4749608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
4750cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
47517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
4752d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
47537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4755cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
4756cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
47574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
4758cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
47597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
47611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
47627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
47637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
47667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
47687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
47857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
47867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4788a9302de4a3297cab9996a5b6cbfde425b89771a7Vadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_f2i},
4789332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
4790cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4791cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
4792cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
4793cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
4794d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
4795cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
4796beb297f2842af34bf063a2c659a411b0a6896ee1Vadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_f2i},
4797b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
4798cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
47994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
4800cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
4801cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
4802cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
48034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
48049b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
4805cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
4806cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
4807d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
48087383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
4809cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
48107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4814cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4815cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4816cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4817cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4818cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4819cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4820cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4821cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4822cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4823cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4824cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4825cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
48269b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
48279b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
48286b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
482942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
48307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
48327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
48337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
48347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
48357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
48367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
48377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
48387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
48397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
48407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
48417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
48427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
48437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
48447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
48457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
48467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
48477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
48487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
48497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
48507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
48517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
48527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
48537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
48557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
48587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
48617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4863df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
48647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
48657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
48667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
48677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
48687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
48697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
48717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
48737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
48747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
48757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
48767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
48777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
48837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
48857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
48867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
48877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
48887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
489013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
48917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
48927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
489350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
489450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
489550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
489650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
489750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
489852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
489950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
490050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
490150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
490250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
490350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
490450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4905c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
490650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
490750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
490850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4909ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
491050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
491150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
491250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
491350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
491650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
491750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
491850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4924cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
49250ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
492650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
492850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4932cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
493350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49341d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
49351d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
493650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
493750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
494050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
494250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
494450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
495050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
495950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
496050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
496150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4964cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4965cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
496650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
498750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4988cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4989cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4990cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4991cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4992cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4993cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4994cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4995cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4996cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4997cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4998cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4999cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
50009b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, 0, tgsi_unsupported},
50019b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
500250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
500350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5004