r600_shader.c revision f01431d0358ae337227a348e96b30adfd8d55f7c
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;
19854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	boolean                 clip_vertex_write;
19954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	unsigned                cv_output;
2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
21042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
224c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
225a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
230a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2328260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2338260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2348260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
23947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
24047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
247fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
24850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
24950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
2504a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
267fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
268fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
271fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
272fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
273fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
2764a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
284fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
28750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
292fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
293fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
2984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
30050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
30150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
30250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
3037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
30521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airliestatic int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input)
30621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie{
30721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	int i, r;
30821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	struct r600_bytecode_alu alu;
30921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	for (i = 0; i < 4; i++) {
31121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_LOAD_P0;
31421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.sel = ctx->shader->input[input].gpr;
31621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.write = 1;
31721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
31821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.dst.chan = i;
31921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
32021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
32121c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		alu.src[0].chan = i;
32221c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie
32321c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (i == 3)
32421c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			alu.last = 1;
32521c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
32621c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie		if (r)
32721c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie			return r;
32821c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	}
32921c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie	return 0;
33021c5607e64ca4ef68730d8e846d8e7744ecdd024Dave Airlie}
3317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3320a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher/*
3330a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Special export handling in shaders
3340a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3350a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_POS:
3360a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 60 is position
3370a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 is misc vector
3380a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 62, 63 are clip distance vectors
3390a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3400a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in 61-63 are controlled by PA_CL_VS_OUT_CNTL:
3410a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_MISC_VEC_ENA - enables the use of all fields in export 61
3420a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_POINT_SIZE - point size in the X channel of export 61
3430a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_EDGE_FLAG - edge flag in the Y channel of export 61
3440a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_RENDER_TARGET_INDX - render target index in the Z channel of export 61
3450a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_VIEWPORT_INDX - viewport index in the W channel of export 61
3460a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * USE_VTX_KILL_FLAG - kill flag in the Z channel of export 61 (mutually
3470a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * exclusive from render target index)
3480a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * VS_OUT_CCDIST0_VEC_ENA/VS_OUT_CCDIST1_VEC_ENA - enable clip distance vectors
3490a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3500a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3510a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * shader export ARRAY_BASE for EXPORT_PIXEL:
3520a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 0-7 CB targets
3530a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * 61 computed Z vector
3540a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3550a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * The use of the values exported in the computed Z vector are controlled
3560a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * by DB_SHADER_CONTROL:
3570a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * Z_EXPORT_ENABLE - Z as a float in RED
3580a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * STENCIL_REF_EXPORT_ENABLE - stencil ref as int in GREEN
3590a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * COVERAGE_TO_MASK_ENABLE - alpha to mask in ALPHA
3600a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * MASK_EXPORT_ENABLE - pixel sample mask in BLUE
3610a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher * DB_SOURCE_FORMAT - export control restrictions
3620a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher *
3630a2c4889cb78825035317ba6bf33440c81eabdfeAlex Deucher */
3645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */
3675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlinstatic int r600_spi_sid(struct r600_shader_io * io)
3685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin{
3695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	int index, name = io->name;
3705b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	/* These params are handled differently, they don't need
3725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 * semantic indices, so we'll use 0 for them.
3735b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	 */
3745b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	if (name == TGSI_SEMANTIC_POSITION ||
3755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_PSIZE ||
3765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		name == TGSI_SEMANTIC_FACE)
3775b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index = 0;
3785b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	else {
3795b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (name == TGSI_SEMANTIC_GENERIC) {
3805b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For generic params simply use sid from tgsi */
3815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = io->sid;
3825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		} else {
3835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			/* For non-generic params - pack name and sid into 8 bits */
3845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			index = 0x80 | (name<<3) | (io->sid);
3855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
3865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3875b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		/* Make sure that all really used indices have nonzero value, so
3885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * we can just compare it to 0 later instead of comparing the name
3895b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		 * with different values to detect special cases. */
3905b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		index++;
3915b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	}
3925b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3935b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	return index;
3945b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin};
3955b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
396725a820b926575265e6790601a0defd9c30947dcVadim Girlin/* turn input into interpolate on EG */
397725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int evergreen_interp_input(struct r600_shader_ctx *ctx, int index)
398725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
399725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int r = 0;
400725a820b926575265e6790601a0defd9c30947dcVadim Girlin
401725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->shader->input[index].spi_sid) {
402725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[index].lds_pos = ctx->shader->nlds++;
403725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[index].interpolate > 0) {
404725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_alu(ctx, index);
405725a820b926575265e6790601a0defd9c30947dcVadim Girlin		} else {
406725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = evergreen_interp_flat(ctx, index);
407725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
408725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
409725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return r;
410725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
411725a820b926575265e6790601a0defd9c30947dcVadim Girlin
412725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int select_twoside_color(struct r600_shader_ctx *ctx, int front, int back)
413725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
414725a820b926575265e6790601a0defd9c30947dcVadim Girlin	struct r600_bytecode_alu alu;
415725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r;
416725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_front = ctx->shader->input[front].gpr;
417725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr_back = ctx->shader->input[back].gpr;
418725a820b926575265e6790601a0defd9c30947dcVadim Girlin
419725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < 4; i++) {
420725a820b926575265e6790601a0defd9c30947dcVadim Girlin		memset(&alu, 0, sizeof(alu));
421725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
422725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.is_op3 = 1;
423725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.write = 1;
424725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.sel = gpr_front;
425725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[0].sel = ctx->face_gpr;
426725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].sel = gpr_front;
427725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].sel = gpr_back;
428725a820b926575265e6790601a0defd9c30947dcVadim Girlin
429725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.dst.chan = i;
430725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[1].chan = i;
431725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.src[2].chan = i;
432725a820b926575265e6790601a0defd9c30947dcVadim Girlin		alu.last = (i==3);
433725a820b926575265e6790601a0defd9c30947dcVadim Girlin
434725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
435725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
436725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
437725a820b926575265e6790601a0defd9c30947dcVadim Girlin
438725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
439725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
440725a820b926575265e6790601a0defd9c30947dcVadim Girlin
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
44272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
44596bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
44672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
4525b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
45335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4548a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
455024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
456725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
457725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->shader->input[i].name == TGSI_SEMANTIC_FACE)
458725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->face_gpr = ctx->shader->input[i].gpr;
459725a820b926575265e6790601a0defd9c30947dcVadim Girlin			else if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR)
460725a820b926575265e6790601a0defd9c30947dcVadim Girlin				ctx->colors_used++;
461725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
462725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, i);
463725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
464725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
46650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
4725b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
473024ac93e60921295ee7a49de1782eeaffd597fa0Marek Olšák		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
47435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
47591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
47691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
47791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (d->Semantic.Name) {
47891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
47991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->clip_dist_write |= d->Declaration.UsageMask << (d->Semantic.Index << 2);
48091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
48191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
48291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				ctx->shader->vs_out_misc_write = 1;
48391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
48454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
48554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->clip_vertex_write = TRUE;
48654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				ctx->cv_output = i;
48754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
48891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			}
48991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin		}
490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
49333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
49447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
49696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
497c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
498c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
4994a47662beaa2092447939db7880531fb706afeddMarek Olšák			struct r600_bytecode_alu alu;
5004a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
50196bbc627f369c0100b950f81531b1fe9ef586c34Christian König
502c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
503c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
504c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
50596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
50696bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
50796bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
50896bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
509c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
51096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5114a47662beaa2092447939db7880531fb706afeddMarek Olšák			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
512c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
513c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
51439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
51539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			break;
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
52172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
52272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
523be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
524be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
525be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
526be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
527be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
5287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
529fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
530fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
531fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
532fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
533fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
534fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
535fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
536fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
537fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
538fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
539fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
543fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
544fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
545fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
546fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
547fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
549fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
550fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
551fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
552fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
553fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
554fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
555fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
556fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
558fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
559fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
560fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
561fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
562fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
563fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
564fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
566fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
567fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
568fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
569fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
5751fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
5761fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
5771fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
5781fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
5791fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
5801fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
5811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
5821fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
5831fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
5841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
5851fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
58696bbc627f369c0100b950f81531b1fe9ef586c34Christian König
5871fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
5881fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
5891fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
5901fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
5911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
5921fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
5931fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
5944a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
5951fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
5961fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
5971fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
5981fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
5991fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
6001fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
60196bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
60239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
60339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 3;
60439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 3;
60539491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 3;
60639491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 3;
60739491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
60839491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		} else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
60939491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[0] = 0;
61039491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[1] = 0;
61139491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[2] = 0;
61239491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->swizzle[3] = 0;
61339491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie			r600_src->sel = 0;
61439491d1d31d9f03437816fbb4f2872761ae1157cDave Airlie		}
615c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
6161fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
6171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
6181fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
6191fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
6201fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
6211fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
6221fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
623077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
624077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
6254a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
626077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
627077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
628077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
629077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
6304a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
631077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
632077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
633077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
634077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
6358e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
636077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
637077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
638077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
639077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
640077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
641077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
642077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
643077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6444a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
645077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
646077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
647077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
648077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
6498e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		ar_reg = ctx->bc->ar_reg;
650077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
651077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
652077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
653077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
654077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
655077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
656077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
657077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
658077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
659077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
660077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
661077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
662077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
663077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
664077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
665d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
666077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6674a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
668077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
669077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
670077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
671077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
672077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
6737687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
6747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
6757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6764a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
6777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
6787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
6797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6817687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
6827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
6837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
6847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
6857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
686077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
687077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
688077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
689077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
690077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
691077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
692077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
693077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
694077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
695077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
696077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
697077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
698077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
6997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
7007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
7014a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
7027687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
7037687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
7047687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
7057687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
7067687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
7077687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
7087687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
7097687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
7107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
7114a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
7127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
7137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
7147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
7157687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
7167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
7177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
7187687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
7217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
7227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
7237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
7247687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
7257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
7267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7274a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
7287687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
7297687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
7307687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
7317687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
7327687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
7337687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7347687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7357687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
7367687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
7377687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
7387687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
7394a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
7407687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
7417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
7427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
7437687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
7447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
7457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
7467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
7477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
7487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
7494a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
7507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
7517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
7527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
7537687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
7547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
7557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
7567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
7577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
7587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
7597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
760725a820b926575265e6790601a0defd9c30947dcVadim Girlinstatic int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
761725a820b926575265e6790601a0defd9c30947dcVadim Girlin{
762725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int i, r, count = ctx->shader->ninput;
763725a820b926575265e6790601a0defd9c30947dcVadim Girlin
764725a820b926575265e6790601a0defd9c30947dcVadim Girlin	/* additional inputs will be allocated right after the existing inputs,
765725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * we won't need them after the color selection, so we don't need to
766725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * reserve these gprs for the rest of the shader code and to adjust
767725a820b926575265e6790601a0defd9c30947dcVadim Girlin	 * output offsets etc. */
768725a820b926575265e6790601a0defd9c30947dcVadim Girlin	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
769725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
770725a820b926575265e6790601a0defd9c30947dcVadim Girlin
771725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (ctx->face_gpr == -1) {
772725a820b926575265e6790601a0defd9c30947dcVadim Girlin		i = ctx->shader->ninput++;
773725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
774725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].spi_sid = 0;
775725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->shader->input[i].gpr = gpr++;
776725a820b926575265e6790601a0defd9c30947dcVadim Girlin		ctx->face_gpr = ctx->shader->input[i].gpr;
777725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
778725a820b926575265e6790601a0defd9c30947dcVadim Girlin
779725a820b926575265e6790601a0defd9c30947dcVadim Girlin	for (i = 0; i < count; i++) {
780725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
781725a820b926575265e6790601a0defd9c30947dcVadim Girlin			int ni = ctx->shader->ninput++;
782725a820b926575265e6790601a0defd9c30947dcVadim Girlin			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
783725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
784725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
785725a820b926575265e6790601a0defd9c30947dcVadim Girlin			ctx->shader->input[ni].gpr = gpr++;
786725a820b926575265e6790601a0defd9c30947dcVadim Girlin
787725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (ctx->bc->chip_class >= EVERGREEN) {
788725a820b926575265e6790601a0defd9c30947dcVadim Girlin				r = evergreen_interp_input(ctx, ni);
789725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (r)
790725a820b926575265e6790601a0defd9c30947dcVadim Girlin					return r;
791725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
792725a820b926575265e6790601a0defd9c30947dcVadim Girlin
793725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = select_twoside_color(ctx, i, ni);
794725a820b926575265e6790601a0defd9c30947dcVadim Girlin			if (r)
795725a820b926575265e6790601a0defd9c30947dcVadim Girlin				return r;
796725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
797725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
798725a820b926575265e6790601a0defd9c30947dcVadim Girlin	return 0;
799725a820b926575265e6790601a0defd9c30947dcVadim Girlin}
800725a820b926575265e6790601a0defd9c30947dcVadim Girlin
801eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader)
80272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
803eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
804eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct tgsi_token *tokens = pipeshader->tokens;
805543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	struct pipe_stream_output_info so = pipeshader->so;
806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
8075555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
8094a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
810457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
81254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int i, j, k, r = 0;
81354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	int next_pixel_base = 0, next_pos_base = 60, next_param_base = 0;
81472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
817c96b9834032952492efbd2d1f5511fe225704918Dave Airlie	r600_bytecode_init(ctx.bc, rctx->chip_class, rctx->family);
818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
823f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
825725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.face_gpr = -1;
826725a820b926575265e6790601a0defd9c30947dcVadim Girlin	ctx.colors_used = 0;
82754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	ctx.clip_vertex_write = 0;
828725a820b926575265e6790601a0defd9c30947dcVadim Girlin
829725a820b926575265e6790601a0defd9c30947dcVadim Girlin	shader->two_side = (ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->two_side;
830725a820b926575265e6790601a0defd9c30947dcVadim Girlin
831eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) ||
832eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color));
833eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
834feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
835feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
837076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
838076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
839076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
840f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
841f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
842f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
844076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
845076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
846076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
847076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
86289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
8634a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
864f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
8654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
866f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
86889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
869fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
87084457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
8724d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_INPUT] + 1;
873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
8744d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
875d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
87697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
87797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
87897e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
879d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
8807728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
8818e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.bc->ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
8824d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
8838e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx.temp_reg = ctx.bc->ar_reg + 1;
884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
885cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
886cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
8875555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
893cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
894cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
895cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
896cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
897cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
898cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
899cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
900cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
901cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
902cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
904de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
907de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
910725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
911725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_PROPERTY:
912725a820b926575265e6790601a0defd9c30947dcVadim Girlin			property = &ctx.parse.FullToken.FullProperty;
91391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (property->Property.PropertyName) {
91491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
915725a820b926575265e6790601a0defd9c30947dcVadim Girlin				if (property->u[0].Data == 1)
916725a820b926575265e6790601a0defd9c30947dcVadim Girlin					shader->fs_write_all = TRUE;
91791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
91891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
91991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				if (property->u[0].Data == 1)
92091d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin					shader->vs_prohibit_ucps = TRUE;
92191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
922725a820b926575265e6790601a0defd9c30947dcVadim Girlin			}
923725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
924725a820b926575265e6790601a0defd9c30947dcVadim Girlin		default:
925725a820b926575265e6790601a0defd9c30947dcVadim Girlin			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
926725a820b926575265e6790601a0defd9c30947dcVadim Girlin			r = -EINVAL;
927725a820b926575265e6790601a0defd9c30947dcVadim Girlin			goto out_err;
928725a820b926575265e6790601a0defd9c30947dcVadim Girlin		}
929725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
930725a820b926575265e6790601a0defd9c30947dcVadim Girlin
931725a820b926575265e6790601a0defd9c30947dcVadim Girlin	if (shader->two_side && ctx.colors_used) {
932725a820b926575265e6790601a0defd9c30947dcVadim Girlin		if ((r = process_twoside_color_inputs(&ctx)))
933725a820b926575265e6790601a0defd9c30947dcVadim Girlin			return r;
934725a820b926575265e6790601a0defd9c30947dcVadim Girlin	}
935725a820b926575265e6790601a0defd9c30947dcVadim Girlin
936725a820b926575265e6790601a0defd9c30947dcVadim Girlin	tgsi_parse_init(&ctx.parse, tokens);
937725a820b926575265e6790601a0defd9c30947dcVadim Girlin	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
938725a820b926575265e6790601a0defd9c30947dcVadim Girlin		tgsi_parse_token(&ctx.parse);
939725a820b926575265e6790601a0defd9c30947dcVadim Girlin		switch (ctx.parse.FullToken.Token.Type) {
940725a820b926575265e6790601a0defd9c30947dcVadim Girlin		case TGSI_TOKEN_TYPE_INSTRUCTION:
941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
944be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
945be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
946be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
9471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
9487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
9497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
9507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
9517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
9527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
95389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
9547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
95589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
95650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
95750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
95850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
964725a820b926575265e6790601a0defd9c30947dcVadim Girlin			break;
965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
967eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
968457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
969eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
97054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.clip_vertex_write) {
97154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		/* need to convert a clipvertex write into clipdistance writes and not export
97254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		   the clip vertex anymore */
97354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
97454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&shader->output[noutput], 0, 2*sizeof(struct r600_shader_io));
97554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
97654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg;
97754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
97854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].name = TGSI_SEMANTIC_CLIPDIST;
97954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->output[noutput].gpr = ctx.temp_reg+1;
98054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		noutput++;
98154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
98254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		shader->clip_dist_write = 0xFF;
98354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
98454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		for (i = 0; i < 8; i++) {
98554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int oreg = i >> 2;
98654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			int ochan = i & 3;
98754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
98854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			for (j = 0; j < 4; j++) {
98954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				struct r600_bytecode_alu alu;
99054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
99154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4);
99254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].sel = shader->output[ctx.cv_output].gpr;
99354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[0].chan = j;
99454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
99554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].sel = 512 + i;
99654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].kc_bank = 1;
99754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.src[1].chan = j;
99854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
99954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.sel = ctx.temp_reg + oreg;
100054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.chan = j;
100154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				alu.dst.write = (j == ochan);
100254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (j == 3)
100354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					alu.last = 1;
100454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				r = r600_bytecode_add_alu(ctx.bc, &alu);
100554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (r)
100654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					return r;
100754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			}
100854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
100954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	}
101054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1011eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* clamp color outputs */
1012eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	if (shader->clamp_color) {
1013eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		for (i = 0; i < noutput; i++) {
1014eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			if (shader->output[i].name == TGSI_SEMANTIC_COLOR ||
1015eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				shader->output[i].name == TGSI_SEMANTIC_BCOLOR) {
1016eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1017eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				int j;
1018eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				for (j = 0; j < 4; j++) {
10194a47662beaa2092447939db7880531fb706afeddMarek Olšák					struct r600_bytecode_alu alu;
10204a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1021eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1022eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					/* MOV_SAT R, R */
1023eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1024eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.sel = shader->output[i].gpr;
1025eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.chan = j;
1026eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.write = 1;
1027eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.clamp = 1;
1028eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].sel = alu.dst.sel;
1029eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].chan = j;
1030eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1031eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (j == 3) {
1032eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						alu.last = 1;
1033eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					}
10344a47662beaa2092447939db7880531fb706afeddMarek Olšák					r = r600_bytecode_add_alu(ctx.bc, &alu);
1035eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (r)
1036eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						return r;
1037eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				}
1038eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			}
1039eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		}
1040eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	}
1041eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
1042543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Add stream outputs. */
1043543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (ctx.type == TGSI_PROCESSOR_VERTEX && so.num_outputs) {
1044543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		for (i = 0; i < so.num_outputs; i++) {
1045543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			struct r600_bytecode_output output;
1046543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1047543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (so.output[i].output_buffer >= 4) {
1048543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				R600_ERR("exceeded the max number of stream output buffers, got: %d\n",
1049543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					 so.output[i].output_buffer);
1050543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				r = -EINVAL;
1051543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1052543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
10532449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			if (so.output[i].start_component) {
10542449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   R600_ERR("stream_output - start_component cannot be non-zero\n");
10552449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   r = -EINVAL;
10562449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			   goto out_err;
1057543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1058543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1059543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			memset(&output, 0, sizeof(struct r600_bytecode_output));
1060543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.gpr = shader->output[so.output[i].register_index].gpr;
1061543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.elem_size = 0;
10622449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			output.array_base = so.output[i].dst_offset;
1063543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_WRITE;
1064543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.burst_count = 1;
1065543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			output.barrier = 1;
1066c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			/* array_size is an upper limit for the burst_count
1067c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			 * with MEM_STREAM instructions */
1068c97632642a7d84a8a21ffde37b3907632e0d01c0Vadim Girlin			output.array_size = 0xFFF;
10692449695e822421fdcaf1c66dffc12d7d705ea69dMarek Olšák			output.comp_mask = (1 << so.output[i].num_components) - 1;
1070543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (ctx.bc->chip_class >= EVERGREEN) {
1071543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1072543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1073543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF0;
1074543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1075543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1076543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF1;
1077543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1078543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1079543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF2;
1080543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1081543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1082543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0_BUF3;
1083543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1084543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1085543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			} else {
1086543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				switch (so.output[i].output_buffer) {
1087543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 0:
1088543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM0;
1089543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1090543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 1:
1091543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM1;
1092543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1093543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 2:
1094543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM2;
1095543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1096543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				case 3:
1097543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					output.inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_MEM_STREAM3;
1098543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák					break;
1099543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				}
1100543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			}
1101543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			r = r600_bytecode_add_output(ctx.bc, &output);
1102543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			if (r)
1103543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák				goto out_err;
1104543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		}
1105543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1106543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1107eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
110854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	for (i = 0, j = 0; i < noutput; i++, j++) {
110954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
111054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = shader->output[i].gpr;
111154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
111254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 0;
111354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 1;
111454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 2;
111554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 3;
111654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
111754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
111854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = -1;
111954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
1120457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
1121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
112291d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			switch (shader->output[i].name) {
112391d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_POSITION:
112454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
112554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
112691d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
112791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin
112891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_PSIZE:
112954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
113054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
113154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				break;
113254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			case TGSI_SEMANTIC_CLIPVERTEX:
113354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				j--;
113491d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
113591d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin			case TGSI_SEMANTIC_CLIPDIST:
113654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pos_base++;
113754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
113854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				/* spi_sid is 0 for clipdistance outputs that were generated
113954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				 * for clipvertex - we don't need to pass them to PS */
114054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				if (shader->output[i].spi_sid) {
114154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					j++;
114254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					/* duplicate it as PARAM to pass to the pixel shader */
114354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					memcpy(&output[j], &output[j-1], sizeof(struct r600_bytecode_output));
114454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].array_base = next_param_base++;
114554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
114654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				}
114791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin				break;
114813daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin			case TGSI_SEMANTIC_FOG:
114913daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_y = 4; /* 0 */
115013daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_z = 4; /* 0 */
115113daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				output[j].swizzle_w = 5; /* 1 */
115213daa059c01d6dd05064e82cf67cba9cc5fe79dbVadim Girlin				break;
1153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
1156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
115754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = next_pixel_base++;
115854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
11594f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
116054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin					for (k = 1; k < shader->nr_cbufs; k++) {
116154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						j++;
116254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						memset(&output[j], 0, sizeof(struct r600_bytecode_output));
116354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].gpr = shader->output[i].gpr;
116454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].elem_size = 3;
116554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_x = 0;
116654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_y = 1;
116754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_z = 2;
116854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].swizzle_w = 3;
116954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].burst_count = 1;
117054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].barrier = 1;
117154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].array_base = next_pixel_base++;
117254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
117354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin						output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1174feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
1175feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
11765f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
117754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
117854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 2;
117954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 7;
118054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
118154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
118239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
118354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].array_base = 61;
118454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_x = 7;
118554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_y = 1;
118654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].swizzle_z = output[j].swizzle_w = 7;
118754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin				output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
1188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
1189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
1190de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
1191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
1192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
1196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
1197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
119872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
119954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
120054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		if (output[j].type==-1) {
120154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
120254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = next_param_base++;
120354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		}
1204457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
120554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1206457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
120754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
120854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
120954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].gpr = 0;
121054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].elem_size = 3;
121154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_x = 7;
121254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_y = 7;
121354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_z = 7;
121454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].swizzle_w = 7;
121554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].burst_count = 1;
121654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].barrier = 1;
121754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
121854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].array_base = 0;
121954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
122054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin			j++;
1221c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
122254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1223481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
122454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && j == 0) {
122554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		memset(&output[j], 0, sizeof(struct r600_bytecode_output));
122654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].gpr = 0;
122754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].elem_size = 3;
122854e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_x = 7;
122954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_y = 7;
123054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_z = 7;
123154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].swizzle_w = 7;
123254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].burst_count = 1;
123354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].barrier = 1;
123454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
123554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].array_base = 0;
123654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		output[j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
123754e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin		j++;
1238481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
123954e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
124054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin	noutput = j;
124154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
1242457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
1243457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
124489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
12457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
12467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
12477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
1248457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
1249b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
1250b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
1251a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
1252c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
1253c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
1254457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
1255457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
12564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
1257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
1259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
12607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
126189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
12624a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
12637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12643b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
1268cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1275f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
1276f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
1278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
12854a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
1286a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
1287a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
1288a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
1289a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
1290a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
1291a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
1292a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
1293a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
1294a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
1295a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
1296a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
12974a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
1298f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
1299f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
1300f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
1301f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
1302f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
13034a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
13043efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
13053efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
13063efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
13073efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
130880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
130980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
131080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
13114a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
13137a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13147a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
1318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
131947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
132047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
13217a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
13227a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
13237a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
1324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1326dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
1327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1328dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
1329d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1330d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1331dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
1332d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1333d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1334d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1335dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
1336dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
1337dffad730df17983cfaef0808555a8c26cad0aa15Christian König
13389b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap, int trans_only)
1339dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1340dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13414a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1342dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1343dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1345d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1346d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1347d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1348d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
13494a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
135080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13517ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1352d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1353d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
13554a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1357d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
13584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
13594a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
13644a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
13667a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
13674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
13687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
13729b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		if (i == lasti || trans_only) {
1373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
13754a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1382d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1383d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
13849b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 0);
1385d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1386d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1387d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1388d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
13899b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 1, 0);
13909b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie}
13919b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie
13929b34cea7e91f90023ca3490603155d758cbdee1cDave Airliestatic int tgsi_op2_trans(struct r600_shader_ctx *ctx)
13939b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie{
13949b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	return tgsi_op2_s(ctx, 0, 1);
1395d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1396d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1397cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1398cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1399cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1400cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1401cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1402cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1403cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1404cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1405cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1406cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1407cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1408cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1409cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1410cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1411cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1412cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1413cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1414cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1415cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1416cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1417cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1418cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1419cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1420cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1421cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1422cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1423cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1424cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1425cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1426cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1427cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
14287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
14297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
14307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
14324a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
14347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
14364a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
14387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
14394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
14407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
14417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
14457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14464a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
14477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
14487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
14497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
14507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
14517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
14527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
145488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
145588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
145688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
145788f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
14581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
145988f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
146096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
146196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
146296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
146396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
146496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
14654a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14667ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
14674a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1468a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
146988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
147088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
147188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
147288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
147388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
147488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
14754a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
14767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1477921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
147888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1479a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
148096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1481ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
148288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
14834a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
148488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
148588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
148688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
14874a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1488a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
14897ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
149088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
149188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
149288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
149388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
149488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
149588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
149688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
14974a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
149888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
149988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
150088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
15014a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1502a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
150388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
150488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
150588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
150688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
150788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
150888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
150988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
151088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
15117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1512921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
151388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1514921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1515ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
151696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
151789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1518a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1519a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
152096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
152196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
152296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
152396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
152496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
152596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
152688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
15274a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
152888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
152988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
153092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
153192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
153292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
15337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
15347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15364a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
15377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
15387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
15397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
15417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
15427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
15437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
15464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
15487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
15497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
15547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
15557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
15567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15574a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
15587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
15597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
15607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
15617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
15627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
15637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
156492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
156592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
156692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15674a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
156892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1569dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
157092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
15711fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
157292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
157392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
157488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
15754a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
157688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
157788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
157888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
157988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
158088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
158188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
158288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
158388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
15844a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
158588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
158688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
158788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
158888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1589be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1590be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1591be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1592be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
15934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1594a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1595be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1596be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
159780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1598be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
159988f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
16004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
160188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
160288f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
160388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
160488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
160588f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
160688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
160792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
160892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
160992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16104a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
16117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
161292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
161357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
161457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
161557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
161657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
16171fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
161857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
161957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
162057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
162192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
162292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
162357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
162489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
16257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
16264a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
16287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
16317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
16327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
16337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
16347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
16357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
16367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
16377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
16384a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
16397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
16407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
16417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
16427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
16434a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
16457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
164692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
16477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
16487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
16497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16504a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
16517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
16527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
16537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
165457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
165592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
165692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
165757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
165889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
16597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
16604a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
16627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
16647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
16657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
16667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
16707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
16714a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
16727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
16737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
16747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
16757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
16764a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
16787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
167957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
16817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
16827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16834a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
16847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
16857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
16867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
168757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
168892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1689ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1690ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
16914a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1692ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1693ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1694ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
169580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1696ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1697ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1698ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1699ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1700ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1701ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
17024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1703ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1704ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1705ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1706ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1707ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1708ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
17094a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1710ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1711ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1712ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
171380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1714ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1715ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1716ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1717ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1718ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1719ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
17204a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1721ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1722ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1723ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1724ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
172592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
172692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
172792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1728094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1729094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
17304a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1731094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1732094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1733094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
17344a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1735094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
17364502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1737094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
17384502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1739921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
17404502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
17414502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
17424502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
17434502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
17444502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
17454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
17464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1747094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1748094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1749094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
17504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1751094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1752094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1753094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
17544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
17554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
17564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
17574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1758094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1759094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1760094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
17610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
17620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
17630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17644a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
17650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
17660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1767f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
17684a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1769f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
17704a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
1771f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1772f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
1773f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1774f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
1775f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
1776f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
1777f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1778f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
17794a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1780f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
1781f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
1782f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
17830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
17840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
17856a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
17866a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
17877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
17886a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
178989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
17907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
1791f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
17924a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
17937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1794f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
1795f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
1796f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
1797f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
17987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
17997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
18027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
18037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18044a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
18057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
1809f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
18104a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1812f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
1813f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
18142fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
18152fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
18162fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
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
18236a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
18246a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
18250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
182686f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
18274a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1828a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
182986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
183086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
18314a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
18324a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
18330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
18340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
18350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
18360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
18370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
18384a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
18390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
18400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
18410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
184289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
18437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
18447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
18454a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
18477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
18487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
18497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
18517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
18527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
18537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
18547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
18554a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
18567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
18577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
18587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
18597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
18607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
18614a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
18637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
18647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
18657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
18667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
18674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
18687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
18697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
18707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
18710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1872abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
18738567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
18744a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
18758567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
18768567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
18778567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
18788567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
18798567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
18804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
18818567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
18828567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
18838567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
1884abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
18854a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1886abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
18874a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1888abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1889abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1890abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1891abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
18924a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1893abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1894abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1895abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1896abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
18974a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1898abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1899abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1900abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1901abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1902abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1903abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
19044a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1905abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1906abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1907abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
19080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
19090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
19100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
191142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
191242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
191342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19144a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
191542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
191642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
19174a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1918df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1919df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1920df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1921df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1922df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1923df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1924df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
192542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
19264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
19274a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
192842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
192942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
193042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
193142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
19324a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
193342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
193442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
193542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
193642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
193742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
193842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1939a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
19407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
19417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19424a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1943a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
19447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
19457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
19464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1948a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
19497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
195080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
19517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
19527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
19537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
19544a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
19567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
19577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
19587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
19597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
19607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1961a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1962a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1963a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19644a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1965a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1966a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
19674a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1968a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1969a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
19704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
1971a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1972a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1973a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1974a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
19754a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1976a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1977a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1978a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1979a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1980a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1981a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
19827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
19837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
19847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
19864a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
19877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
19887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
19904a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
19924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
19937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
19947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
19957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
19967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
19977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
19997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
20007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
20017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
20027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
20044a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
20064a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
20097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
20114a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
20174a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
20247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20254a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
20287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
20297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
20307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
20317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2032a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
2033a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
20344a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2035a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
2036a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
2037a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
20384a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2039a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
20404a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2041a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2042a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2043a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2045a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2046a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2047a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
20484a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
204966f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
20504a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
2051a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
2052a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2053a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2054a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20554a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2056a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2057a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2058a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
20594a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2060a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2061a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
2062a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
2063a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
2064a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
20654a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
2066a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
2067a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
2068a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
2069a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
2070a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
20714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_divmod(struct r600_shader_ctx *ctx, int mod, int signed_op)
2072332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin{
2073332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2074332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	struct r600_bytecode_alu alu;
2075332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int i, r;
2076332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
2077332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp0 = ctx->temp_reg;
2078332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	int tmp1 = r600_get_temp(ctx);
20794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	int tmp2 = r600_get_temp(ctx);
20804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
20814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	/* Unsigned path:
20824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * we need to represent src1 as src2*q + r, where q - quotient, r - remainder
20844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 1. tmp0.x = rcp (src2)     = 2^32/src2 + e, where e is rounding error
20864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 2. tmp0.z = lo (tmp0.x * src2)
20874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 3. tmp0.w = -tmp0.z
20884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 4. tmp0.y = hi (tmp0.x * src2)
20894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src2))
20904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error
20914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 7. tmp1.x = tmp0.x - tmp0.w
20924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 8. tmp1.y = tmp0.x + tmp0.w
20934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x)
20944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 10. tmp0.z = hi(tmp0.x * src1)     = q
20954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 11. tmp0.y = lo (tmp0.z * src2)     = src2*q = src1 - r
20964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
20974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 12. tmp0.w = src1 - tmp0.y       = r
20984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 13. tmp1.x = tmp0.w >= src2		= r >= src2 (uint comparison)
20994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 14. tmp1.y = src1 >= tmp0.y      = r >= 0 (uint comparison)
21004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * if DIV
21024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.z + 1			= q + 1
21044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.z - 1			= q - 1
21054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * else MOD
21074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   15. tmp1.z = tmp0.w - src2			= r - src2
21094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *   16. tmp1.w = tmp0.w + src2			= r + src2
21104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * endif
21124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 17. tmp1.x = tmp1.x & tmp1.y
21144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * DIV: 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z
21164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * MOD: 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z
21174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z
21194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * 20. dst = src2==0 ? MAX_UINT : tmp0.z
21204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Signed path:
21224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 *
21234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * Same as unsigned, using abs values of the operands,
21244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 * and fixing the sign of the result in the end.
21254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	 */
2126332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2127332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	for (i = 0; i < 4; i++) {
2128332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		if (!(write_mask & (1<<i)))
2129332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			continue;
2130332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
2132332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = -src0 */
21344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2136332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
21394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
2140332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2142332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2144332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
21484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = -src1 */
2150332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2152332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
2155332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2156332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = V_SQ_ALU_SRC_0;
2158332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2160332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
21614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
21644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.z sign bit is set if src0 and src2 signs are different */
21664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* it will be a sign of the quotient */
21674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (!mod) {
21684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT);
21714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp2;
21734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 2;
21744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
21754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
21774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2178332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2179332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				alu.last = 1;
21804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
21814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
21824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
21834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.x = |src0| */
21854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
21864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
21874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
21884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
21904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 0;
21914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
21924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
21944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
21954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
21964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 0;
21974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
21984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
21994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2200332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
22014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* tmp2.y = |src1| */
22034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
22054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.is_op3 = 1;
22064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp2;
22084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 1;
22094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
22104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
22124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
22134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].sel = tmp2;
22144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[2].chan = 1;
22154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
22174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
22194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2220332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2221332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 1. tmp0.x = rcp_u (src2)     = 2^32/src2 + e, where e is rounding error */
22234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_UINT);
2225332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
22274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
22284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
22294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
22314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp2;
22324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
22334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
22344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
22354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
22364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
22404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 2. tmp0.z = lo (tmp0.x * src2) */
2242332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
2244332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2245332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp0;
22464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
2247332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2248332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2249332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp0;
22504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
22514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
22524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
22534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
22544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
22554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
22564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2257332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
22614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 3. tmp0.w = -tmp0.z */
22634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
22654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
22674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
22684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
22694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
22714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
22724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
22734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
22764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
22774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 4. tmp0.y = hi (tmp0.x * src2) */
22794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
22804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
22814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
22834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
22844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
22854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
22874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
22884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
22894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
22904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
22914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
22924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
22934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2294332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2295332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
22964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
22974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2298332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2299332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 5. tmp0.z = (tmp0.y == 0 ? tmp0.w : tmp0.z)      = abs(lo(rcp*src)) */
23014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
23034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2304332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
23074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
23114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
23134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
23144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
23154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
23174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
23184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
23194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 6. tmp0.w = hi (tmp0.z * tmp0.x)    = e, rounding error */
2321332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
2323332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
23264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 2;
23304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 0;
23334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
23354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
23364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
23374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 7. tmp1.x = tmp0.x - tmp0.w */
23394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2341332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2342332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
23434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2344332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2345332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
23484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
23504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2351332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
23524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2353332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2354332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 8. tmp1.y = tmp0.x + tmp0.w */
2356332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
2358332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2359332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
23604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
2361332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2362332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
23654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
23664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
2367332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2368332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.last = 1;
23694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2370332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2371332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 9. tmp0.x = (tmp0.y == 0 ? tmp1.y : tmp1.x) */
23734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
23754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2376332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
23774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
23794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
23824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
23834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
23844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
23854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
23864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 0;
23874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
23894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
23904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
23914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 10. tmp0.z = hi(tmp0.x * src1)     = q */
2393332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
23944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULHI_UINT);
23954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
23964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
23974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
23984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
23994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
24014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
24024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
24044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
24054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 0;
24064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
24074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
24084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
24094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
24134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 11. tmp0.y = lo (src2 * tmp0.z)     = src2*q = src1 - r */
24154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
24174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
24194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
24204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
24214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
24234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
24244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 1;
24254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
24264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
24274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
24284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
24304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 2;
24314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
24354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 12. tmp0.w = src1 - tmp0.y       = r */
24374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
24394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
24414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 3;
24424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
24434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
24454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
24464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
24474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
24484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
24494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
24504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
24524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
24534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
24574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 13. tmp1.x = tmp0.w >= src2		= r >= src2 */
24594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
2461332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2462332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.sel = tmp1;
24634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
2464332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.dst.write = 1;
2465332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp0;
24674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 3;
24684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
24694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = tmp2;
24704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].chan = 1;
24714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
24724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
24734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2474332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
24774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
2478332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
24794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 14. tmp1.y = src1 >= tmp0.y       = r >= 0 */
24804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT);
24824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
24844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 1;
24854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
24864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
24884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp2;
24894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 0;
24904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
24914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
24924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
24934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
24954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
24964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
24974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
24984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2499332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2500332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (mod) { /* UMOD */
2502332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.w - src2			= r - src2 */
2504332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
2506332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2507332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.sel = tmp1;
25084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
2509332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			alu.dst.write = 1;
2510332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
25124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
2513332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
25154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
25164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
25174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
25184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
25194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
25204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.w + src2			= r + src2 */
25264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
25284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
25304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
25314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
25344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 3;
25354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (signed_op) {
25364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp2;
25374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 1;
25384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
25394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
25404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
25414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else { /* UDIV */
25474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 15. tmp1.z = tmp0.z + 1       = q + 1       DIV */
25494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
25514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
25534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
25544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
25574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
25584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
25594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				return r;
25634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* 16. tmp1.w = tmp0.z - 1			= q - 1 */
25654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
25674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp1;
25694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 3;
25704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
25714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].sel = tmp0;
25734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[0].chan = 2;
25744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.src[1].sel = V_SQ_ALU_SRC_M_1_INT;
25754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.last = 1;
25774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2578332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin				return r;
25794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
2580332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		}
2581332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 17. tmp1.x = tmp1.x & tmp1.y */
25834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT);
25854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp1;
25874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 0;
25884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
2589332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
25904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
25914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
25924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
25934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 1;
25944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
25964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
25974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
25984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
25994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.z : tmp1.z    DIV */
26004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 18. tmp0.z = tmp1.x==0 ? tmp0.w : tmp1.z    MOD */
2601332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
26034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
2604332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.sel = tmp0;
26064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.chan = 2;
26074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.dst.write = 1;
2608332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].sel = tmp1;
26104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 0;
26114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp0;
26124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = mod ? 3 : 2;
26134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp1;
26144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
26154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
26174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			return r;
26194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		/* 19. tmp0.z = tmp1.y==0 ? tmp1.w : tmp0.z */
26214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDE_INT);
26234ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.is_op3 = 1;
26244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26254ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
26264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.sel = tmp0;
26274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.chan = 2;
26284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			alu.dst.write = 1;
26294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		} else {
26304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
26314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
2632332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
2633332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin		alu.src[0].sel = tmp1;
26344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[0].chan = 1;
26354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].sel = tmp1;
26364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[1].chan = 3;
26374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].sel = tmp0;
26384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.src[2].chan = 2;
2639332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		alu.last = 1;
26414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2642332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin			return r;
2643332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
26444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		if (signed_op) {
26454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			/* fix the sign of the result */
26474ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26484ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			if (mod) {
26494ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
26514ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26524ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
26534ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26544ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
26554ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
26564ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26574ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26584ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
26594ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
26604ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
26614ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26624ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
26634ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26644ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26654ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26664ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* sign of the remainder is the same as the sign of src0 */
26674ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = src0>=0 ? tmp0.z : tmp0.x */
26684ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26694ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
26704ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
26714ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26724ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
26734ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26744ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
26754ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
26764ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
26774ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
26784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
26794ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26804ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
26814ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
26824ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
26834ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26844ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			} else {
26854ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26864ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = -tmp0.z */
26874ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26884ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
26894ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26904ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.sel = tmp0;
26914ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.chan = 0;
26924ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.dst.write = 1;
26934ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26944ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = V_SQ_ALU_SRC_0;
26954ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
26964ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
26974ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
26984ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
26994ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
27004ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
27014ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27024ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* fix the quotient sign (same as the sign of src0*src1) */
27034ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				/* tmp0.x = tmp2.z>=0 ? tmp0.z : tmp0.x */
27044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27054ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
27064ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.is_op3 = 1;
27074ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27084ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
27094ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27104ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].sel = tmp2;
27114ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[0].chan = 2;
27124ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].sel = tmp0;
27134ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[1].chan = 2;
27144ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].sel = tmp0;
27154ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.src[2].chan = 0;
27164ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27174ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				alu.last = 1;
27184ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin				if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
27194ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin					return r;
27204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin			}
27214ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin		}
27224ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	}
2723332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	return 0;
2724332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin}
2725332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin
27264ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_udiv(struct r600_shader_ctx *ctx)
27274ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
27284ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 0);
27294ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
27304ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27314ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_umod(struct r600_shader_ctx *ctx)
27324ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
27334ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 0);
27344ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
27354ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27364ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_idiv(struct r600_shader_ctx *ctx)
27374ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
27384ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 0, 1);
27394ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
27404ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27414ba4853c0a613f771b44806cd5ce376838479802Vadim Girlinstatic int tgsi_imod(struct r600_shader_ctx *ctx)
27424ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin{
27434ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	return tgsi_divmod(ctx, 1, 1);
27444ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin}
27454ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin
27466b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlinstatic int tgsi_iabs(struct r600_shader_ctx *ctx)
27476b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin{
27486b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
27496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	struct r600_bytecode_alu alu;
27506b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int i, r;
27516b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
27526b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
27536b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27546b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* tmp = -src */
27556b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
27566b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
27576b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
27586b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27596b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27606b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT);
27616b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27626b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.sel = ctx->temp_reg;
27636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.chan = i;
27646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
27656b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27666b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
27676b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[0].sel = V_SQ_ALU_SRC_0;
27686b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27696b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
27706b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
27716b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
27726b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
27736b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
27746b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
27756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27766b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	/* dst = (src >= 0 ? src : tmp) */
27776b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	for (i = 0; i < 4; i++) {
27786b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (!(write_mask & (1<<i)))
27796b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			continue;
27806b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27816b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27826b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
27836b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.is_op3 = 1;
27846b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.dst.write = 1;
27856b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27866b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
27876b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27886b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
27896b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
27906b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].sel = ctx->temp_reg;
27916b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		alu.src[2].chan = i;
27926b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
27936b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (i == last_inst)
27946b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			alu.last = 1;
27956b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
27966b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin		if (r)
27976b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin			return r;
27986b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	}
27996b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	return 0;
28006b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin}
28016b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
280242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlinstatic int tgsi_issg(struct r600_shader_ctx *ctx)
280342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin{
280442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
280542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	struct r600_bytecode_alu alu;
280642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int i, r;
280742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	unsigned write_mask = inst->Dst[0].Register.WriteMask;
280842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	int last_inst = tgsi_last_instruction(write_mask);
280942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
281042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* tmp = (src >= 0 ? src : -1) */
281142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
281242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
281342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
281442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
281542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
281642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE_INT);
281742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
281842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
281942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.sel = ctx->temp_reg;
282042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.chan = i;
282142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
282242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
282342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
282442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
282542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = V_SQ_ALU_SRC_M_1_INT;
282642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
282742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
282842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
282942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
283042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
283142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
283242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
283342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
283442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	/* dst = (tmp > 0 ? 1 : tmp) */
283542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	for (i = 0; i < 4; i++) {
283642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (!(write_mask & (1<<i)))
283742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			continue;
283842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
283942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
284042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT_INT);
284142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.is_op3 = 1;
284242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.dst.write = 1;
284342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
284442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
284542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
284642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].sel = ctx->temp_reg;
284742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[0].chan = i;
284842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
284942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[1].sel = V_SQ_ALU_SRC_1_INT;
285042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
285142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].sel = ctx->temp_reg;
285242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		alu.src[2].chan = i;
285342539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
285442539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (i == last_inst)
285542539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			alu.last = 1;
285642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		r = r600_bytecode_add_alu(ctx->bc, &alu);
285742539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin		if (r)
285842539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin			return r;
285942539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	}
286042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	return 0;
286142539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin}
286242539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin
28636b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
28646b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin
28650d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
28660d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
28670d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
28684a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2869921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
28700d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28710d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
28720d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
28734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2874a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
28750d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
2876cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
28770d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
2878cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
28790d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2881921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
28824a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
28830d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28840d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
28850d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
28864a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
28870d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
28880d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
28890d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
28900d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28910d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
28920d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
28934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
28950d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
289680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
28970d48925a56ad4fb253386110b545abda82a25464Dave Airlie
28980d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2899cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
29000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
29010d48925a56ad4fb253386110b545abda82a25464Dave Airlie
2902921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
29030d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
29040d48925a56ad4fb253386110b545abda82a25464Dave Airlie
29050d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
2906cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
29070d48925a56ad4fb253386110b545abda82a25464Dave Airlie
29080d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
29090d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
29104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
29110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
29120d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
29130d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
29140d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
29150d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
29160d48925a56ad4fb253386110b545abda82a25464Dave Airlie
2917cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
2918cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
29194a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2920cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
2921cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
29234a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2924cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
2925a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
29266c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
2927cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
2928a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
292980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2930cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
2931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
2932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
2933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
2934cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
2935cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
29364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2937cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
2938cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
2939cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
2940cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
2941cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
2942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
2944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
2945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
2948dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
29507be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
29517be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
29527be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
29537be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
29544a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
2956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
29574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
2958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
29597be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
296080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
2962cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
2963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
29647be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
2965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
29674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
2970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
29717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
2972cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
2973cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2974cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
2975cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
2976cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29774a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2978cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
2979cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
2980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
29814a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2982cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
2983cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
29844a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
2985cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
2986a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
298780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2988cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
2989a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
2990cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
2991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
2992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
2993cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
2994921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
2995cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
2996cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
2997cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
2998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
2999cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
3000921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
3001cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
3002cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
3003cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3004e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
3005e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
3006e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
3007e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
3008e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
3009e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
3010e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
3011cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
3012cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
3013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
3014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
3015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
3016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
30174a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
3019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
30217be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
3022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
30246415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
30256415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
30266415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
30276415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30286415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
30296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
30306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
30316415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
30326415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
30336415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
30346415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
30356415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
30366415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30376415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
30386415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
30396415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
304033241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
304133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
304296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
304333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
30444a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
30454a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3046641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
304740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
3048bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
3049da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
3050da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
30516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
305278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
305313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
30541d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	u8 offset_x = 0, offset_y = 0, offset_z = 0;
3055641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
30566415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
3057641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
30581d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
30591d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
30601d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
30611d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
30621d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
30631d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
30641d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
30651d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
30661d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
30671d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
306813c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
306913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
307013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
307140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
307240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
30734a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
307440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
307540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
307640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
307740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
307840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
307940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
308040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
308140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
308240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
308340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
308440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
308540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
308640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
30874a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
308840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
30894a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
309040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
309140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
309240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
309340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
309440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
30954a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
309640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
309740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
309840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
309913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
310040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
310140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
310240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
310340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
310440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
310540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
310640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
310740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
310840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
310940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
311040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
311140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
311240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
311340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
311440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
311540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
31164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
311740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
311840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
311913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
312013c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
31217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
3122b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
312389dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
31247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
31257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
31264a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
31284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
3129bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
31307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
31317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
31327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
31337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
31347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
31357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
31364a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
31377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
31387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
31397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
31407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
31417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
31427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
31434a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
31447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
31454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
31467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
31477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
31487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
31497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
31507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
31514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
31527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
31537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
31547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
31559d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
3156b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
31574a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3158a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
3159b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
31607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
31614a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
3162b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3163b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3164b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
31654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3166b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3167b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3168b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
31694a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3170a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
3171921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3172b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
3173b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
3174b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
3175b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
3176b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
31774a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3178b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
3179b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
318078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3181b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3182bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3183bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
31849783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if ((inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
31859783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) &&
3186261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie	    inst->Instruction.Opcode != TGSI_OPCODE_TXQ) {
3187261dc72fe3ce969bb4592ac49280147cd72f4414Dave Airlie
31880e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
31890e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
3190bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3191bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
3192bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
31934a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3194a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
31954a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
31964a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
3197bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
3198bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
3199bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
3200bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
3201bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
32024a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3203bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
3204bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
3205bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
3206bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3207bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
320889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
32097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
32104a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
32127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
32137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
32147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
32157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
32167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
32177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
32187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
32197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
32207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
32214a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
32227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
32237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
32247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
32257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
32264a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
32287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
32297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
32307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
32317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
32327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
32337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
32347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
32354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
32367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
32377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
32387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
32397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3240bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
3241bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
32427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
3243bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
32444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3245a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3246bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3247bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3248bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3249bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
3250bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3251bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
32527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3253bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3254bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3255a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3256bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3257bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3258bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
3259bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3260bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
32614a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3262bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3263bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
3264bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
32654a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3266a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3267bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
3268bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3269bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3270bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
3271bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
3272bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
32737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3274bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
3275bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
3276a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
3277bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3278bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
3279bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
3280bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
3281bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3282bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
32834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3284bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
3285bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
32869783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		/* write initial W value into Z component */
32879783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
32889783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
32899783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
32909783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
32919783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.sel = ctx->temp_reg;
32929783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.chan = 2;
32939783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.dst.write = 1;
32949783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			alu.last = 1;
32959783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			r = r600_bytecode_add_alu(ctx->bc, &alu);
32969783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie			if (r)
32979783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie				return r;
32989783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		}
329978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3300bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
3301bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
3302bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
330378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
3304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
33054a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3306a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
33074a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
3308b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
3309b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
3310b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
3311b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
3312b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
33134a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3314b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
3315b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
3316b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
331778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
3318b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
3319b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
33207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3321bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
3322929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3323929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
33246b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
33259783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	    inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
3326929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY ||
3327929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) {
3328de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
3329de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
3330de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
3331de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3332de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
3333de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
3334de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3335c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák		case SQ_TEX_INST_SAMPLE_LB:
3336c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			opcode = SQ_TEX_INST_SAMPLE_C_LB;
3337c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák			break;
3338de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
3339de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
3340de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
3341de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
3342de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
334333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
33444a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
3345bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
33466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
33476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
3348077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
3349641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
33506c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
33519d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
33529d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
33539d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
33549d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
335578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
335678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
335778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
335878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
335978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
336078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
336178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
336278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
336378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
336478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
3365244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
336678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
33679a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
3368bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
3369bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
3370bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
3371bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
3372bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
3373bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
33749783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE) {
33759783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_x = 1;
33769783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_y = 0;
33779783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_z = 3;
33789783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie		tex.src_sel_w = 2; /* route Z compare value into W */
33799783bba9bdd56cc52f987056ba8dc3da77d0078eDave Airlie	}
3380bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
33816b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	if (inst->Texture.Texture != TGSI_TEXTURE_RECT &&
33826b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	    inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT) {
338301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
338401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
338501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
33866b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_z = 1;
33876b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	tex.coord_type_w = 1;
3388bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
33891d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
33901d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
33911d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
339269d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
3393929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	/* Put the depth for comparison in W.
3394929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * TGSI_TEXTURE_SHADOW2D_ARRAY already has the depth in W.
3395929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	 * Some instructions expect the depth in Z. */
3396929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if ((inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D ||
3397929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D ||
33986b9a36cc3ff3b0a65f70b8a5503e26339a0e4fbeMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT ||
3399929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	     inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) &&
3400929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_L &&
3401929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    opcode != SQ_TEX_INST_SAMPLE_C_LB) {
340278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
3403929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	}
3404929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák
3405929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY ||
3406929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	    inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) {
3407929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		if (opcode == SQ_TEX_INST_SAMPLE_C_L ||
3408929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		    opcode == SQ_TEX_INST_SAMPLE_C_LB) {
3409929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Y */
3410929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_y = 0;
3411929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		} else {
3412929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			/* the array index is read from Z */
3413929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.coord_type_z = 0;
3414929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák			tex.src_sel_z = tex.src_sel_y;
3415929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		}
3416929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
3417929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		   inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
3418929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		/* the array index is read from Z */
3419929ad43b11cfc24f3e27bc1da2523b7fc142917fMarek Olšák		tex.coord_type_z = 0;
3420bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
34214a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
3422bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
3423bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
3424bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
3425bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
3426bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
342733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
342833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
3429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
3430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
3431b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
34324a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3433dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3434b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
3435b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
3436b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3437c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
34381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
3439c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
3440c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3441c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
3442c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
34434a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3444c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
34454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
34464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3447c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
344880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3449c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
3450c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
3451c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
3452c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
34534a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
3454c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
3455c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
3456c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
3457c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
3458c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
3459c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
3460b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
3461dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3462dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3463dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3464dffad730df17983cfaef0808555a8c26cad0aa15Christian König
34654a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3466a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
3467921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
3468b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
34694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
34704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
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	/* (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_OP2_SQ_OP2_INST_MUL);
3489b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
3490b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
34914a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3492b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
3493b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3494dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3495b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3496b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
3497b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
34984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3499b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3500b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3501b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3502b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
3503b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
3504dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
3505dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3506dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
3507dffad730df17983cfaef0808555a8c26cad0aa15Christian König
35084a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3509a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
3510b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
35114a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
35124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
3513b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
3514b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
3515dffad730df17983cfaef0808555a8c26cad0aa15Christian König
351680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3517b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
3518dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
3519b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
3520b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
35214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3522b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
3523b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
3524b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
3525dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
3526b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
3527b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
352887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
352987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
353087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35314a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
353287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
3533dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
353487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
35357be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
35367be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
35377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
353887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
35394a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3540a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
35414a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
35424a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
35434a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
354480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
354587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
354687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
354787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
35487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
354987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
35504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
355187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
355287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
35537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
355487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
355587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
355687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
35570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
35580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
35590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
35600e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
35610e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
35624a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
35630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
35640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
35650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
35670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
35680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
35704a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3571a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
35720e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
35734a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
35744a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
35750e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
35760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
35770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
35780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
35790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
35800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
35810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
35830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
35840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
35850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
35870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
35884a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
35890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
35900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
35910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
35920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
35944a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3595a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
35960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
35970e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
35984a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
35994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
36000e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
36010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
36020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
36030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
36040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
36050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
36060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
36070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
36080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
36090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
36100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
36110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
36120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
361380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
361480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
36150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
36160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
36170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
36180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
36190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
36204a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
36210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
36220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
36230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
36240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
36250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
36260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
36270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
36280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
362936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
363036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
363136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
36324a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
363309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
36347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
363536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
363636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
363736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
36384a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
363936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3640a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
36414a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
364236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
364336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
364436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
364536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
364636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
36474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
364836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
364936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
365036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
365189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
36527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
36547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
36557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
365636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
36577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
36587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
36597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
36607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
36617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
36627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
36634a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
36647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
36657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
36667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
36677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
36687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
36697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
36707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
36717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
36727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
36737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
36747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
36757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
36764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
36777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
36787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
36797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
368036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
36817ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
368236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
368336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
36844a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
368536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3686a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
36874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
368836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
368936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
3690b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
3691b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3692b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
3693b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
3694b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
369536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
369636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
369736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
369836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
369936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
37004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
370136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
370236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
370336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
370436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
370536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
370636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
370789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
37094a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
37114a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
371236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
37147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
37157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
37167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
37177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
37187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
371936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
37204a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
37217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
37227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
37237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
37247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
37254a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
37274a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
372836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
37297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
37307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
37317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
37327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
37367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
37377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
373936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
374036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
374136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
374236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
37434a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
374436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
3745a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
374636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
374736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
374836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
374936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
375036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
375136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
375236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
37534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
375436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
375536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
375636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
375736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
375836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
375987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
3760460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
3761460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
3762460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
37634a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
3764460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
37657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
3766460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3767f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
3768460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
376989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
37707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
37714a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3772460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
37737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
37744a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
37754a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
37767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
37787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
37797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
37807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
37817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
37827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
37834a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
37847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
37857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
37867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
3787460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
37887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
37894a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
37907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
37924a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
37934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
37947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
37957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
37967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
37977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
37987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
37994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
3803460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3804460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
3805460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
3806460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
3807460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3808460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3809460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
3810460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3811460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3812460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
38134a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3814460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3815460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3816460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3817460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3818f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
3819460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
3820460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
382189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38234a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
382496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
38264a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
38274a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
382896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
38327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
38357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38364a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38414a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
38444a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
38454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
38467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
38497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
38517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
38537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
38547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
38557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
385696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
385896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
385996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
386096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
386196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
386296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
386396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
386496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
386596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
386696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
386796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38684a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
386996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
387096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
387196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
387289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
38737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
38744a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
38767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
38777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
38787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
38797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
38807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
38817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
38827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
38837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
38847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
388596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38864a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
38877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
38887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
38897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
38907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
38914a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
38927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
38937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
38947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
389596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
38967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
38977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
38987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
38997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
390096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39014a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
390596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
390689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39084a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
39117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
39127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
39167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
39197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39204a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39254a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
39277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
39287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
392996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
39327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
393496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39354a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
393996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39404a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
394196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
394296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
394396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
39444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
39454a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
394696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
394796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
394896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
3949460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3950460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
3951460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
3952460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
3953460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
3954460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39554a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
3956460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
3957460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
3958460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3959460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3960f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
3961460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
396289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
39637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
39644a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3965460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
39674a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
39684a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
3969460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
39717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
39737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
39747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
39757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
3976460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
39774a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
39787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
39797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
39807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
39817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
39824a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
39837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
39854a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
39864a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
39877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
39897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
39907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
39917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
39927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
39934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
39947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
39957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
39967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
3997460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
3998460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
3999460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
4000460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
40014a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4002460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4003460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
4004460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
4005460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
4006460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4007460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
4008460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
4009460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
4010460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
4011460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
40124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
4013460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
4014460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
4015460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
4016460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
4017460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
4018460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
4019460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
402098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
402198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
402298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
40234a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
402498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
4025a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
40264a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
402798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
402852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
402952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
403052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
403152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
403252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
403352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
403452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
40359b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
40368e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
40379b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
403852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
403952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
404052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
404152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
404252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
40438e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
404498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
40458e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.sel = ctx->bc->ar_reg;
40468e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	alu.dst.write = 1;
40474a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
404898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
404998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
40508e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
40518e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
405298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
405398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
405498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
405547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
405647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
40574a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
405847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
4059a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
40607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
40617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
4062077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4063077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
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;
4071077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4072077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4073077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
40748e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.src[0].sel = ctx->bc->ar_reg;
40758e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4076077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4077077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4078077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
40794a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4080077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
40817ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
40827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
4083077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
4084077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
40854a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40868e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
4087077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
4088077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
4089077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
40904a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
4091077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
40927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
40939b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	case TGSI_OPCODE_UARL:
40948e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		memset(&alu, 0, sizeof(alu));
40958e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
40968e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
40978e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.sel = ctx->bc->ar_reg;
40988e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.dst.write = 1;
40998e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		alu.last = 1;
41008e366dc365d01213b71b87ace47d30938db74845Vadim Girlin
41018e366dc365d01213b71b87ace47d30938db74845Vadim Girlin		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
41028e366dc365d01213b71b87ace47d30938db74845Vadim Girlin			return r;
41039b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		break;
41047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
41057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
41067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
41077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
41087ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
41098e366dc365d01213b71b87ace47d30938db74845Vadim Girlin	ctx->bc->ar_loaded = 0;
411047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
411147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
411247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
411357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
411457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
411557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
41164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
411757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
411857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
411957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
41204a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
412157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4122a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
412380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
41247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
41257ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
412657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
412757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
41284a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
412957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
413057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4131a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
413257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
413357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
41344a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
413557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
413657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
413757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
41384a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
413957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
414057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
414157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
414257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
414357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
414457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
4145a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
4146a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
41474a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
4148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
4149a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
41504a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4151a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
4152a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
4153a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4154a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
4155a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
4156a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
4157a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
41584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
4159a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
4160a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
41617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4162a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
4163a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
41644a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
4165a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
4166a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
4167a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4168a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4169a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4170a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
4171a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
41722bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
41732bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
41742bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
41752bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
41762bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
41774f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU))
41782bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
41794f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER))
41802bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
41812bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
41822bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
41832bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
41844f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER);
41852bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
41862bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
41874f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER);
41882bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
41892bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
41902bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
41912bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
41922bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
41932bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
41942bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
41954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
41968813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
41978813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
41988813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
41992bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
4200a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4201a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4202a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
420309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
4204a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
420509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
420609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
420709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
420809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
420909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
421009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
421109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
421209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
421309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
421409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
421509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
421609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
421709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
421809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4219a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
422009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
422109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
422209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
422309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
422409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
422509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
422609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
422709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
422809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
422909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
423009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
4231a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
4232a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
4233a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
423409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
423509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
423609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
423709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
423809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
423909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
424009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
42417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
424209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
424309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
424409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
424509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
424609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
424709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
424809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
424909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
425009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
425109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
425209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
425309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
425409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
425509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
425609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
425709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
425809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
425909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
426009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
426109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
426209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
426309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
426409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
426509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
42664a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
42674a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
426809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
426909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
427009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4271a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
427209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
427309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
4274a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
427509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
427609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
427709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
427809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
427909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
428009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
428109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
428209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
428309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
428409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
428509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
428609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
428709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
428809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
428909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
429009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
429109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
429209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
429309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
429409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
42954f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_RETURN));
429609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
429709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
429809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
429909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
430009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
430109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
43024f7c21899ad449be2bc1157ce1d2d99296a34499Marek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
430309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
430409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
430509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
430609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
4307a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
430809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
430909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
431009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
431109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
431209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
431309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
431409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
43157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
431609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
431709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
431809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
431909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
432009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
432109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
432209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
432309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
432409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
432509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
432609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
432709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
432809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
432909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
433009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
43314a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
433209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
433309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
433409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
433509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
433609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
433709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
433809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
433909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
434009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
434109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
43428b36958ceb23b8a40a622f950ddf8fe94583c143Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT));
434309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
43444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
434509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
434609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
434709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
434809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
4349a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4350a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4351a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4352a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
4353a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
43544a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
4355a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
4356a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
435709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
4358a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
4359a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4360a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4361a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4362a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
4363a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
4364a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
4365a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
4366a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
4367a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
4368a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
4369a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4370a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
4371a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
4372a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
4373a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
437409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
4375a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
437609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
437709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
437809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
437909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
438009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
438109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
438209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
438309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
43844a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
438509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
438609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
4387a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
438809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
438909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
439009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
439109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
439209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
439309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
439409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
439509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
439609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
43974a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
439809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
439909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
440009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
440109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
440209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
440309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
440409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
440509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
440609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
440709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
440809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
440909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
441009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
441109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
441209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
441309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
441409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
441509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
441609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
441709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
441809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
441909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
442009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
442109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
442209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
442309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
442409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
442509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
442609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
442709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
442809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
442909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
443009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
443109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
443209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
443309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
443409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
443509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
443609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
44374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
443809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
443909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
444009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
444109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
444209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
444309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
4444a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
4445a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
4446a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
4447cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
4448cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
4449cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
4450cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
4451cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
4452cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
4453cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4454cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
4455cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
4456cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4457cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
4458cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4459cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4460cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4461cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
4462cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
4463cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
4464cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4465c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT);
4466cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
4467cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
4468cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
4469cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
44709b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie		alu.last = 1;
4471cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
4472cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
4473cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
4474cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
4475cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4476cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4477cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
4478cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
4479cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
4480cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4481cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
4482cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
4483cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4484c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
4485cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4486cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
4487cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
4488cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4489cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
4490cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
4491cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
4492cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
4493cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
4494cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
4495cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
4496cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
4497cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
4498cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
4499cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
4500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
450198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
4502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
45030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
4504df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
4505df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
4506df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
4507df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
4508df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
4509df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
4510df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
451142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
451236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
4513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
4514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
4515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
4516cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4517cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
451857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
4519dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
4520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
4521d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
4522be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
4523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
4524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
4525b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
4526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45333af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
4534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45353af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4536df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
45377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
45384558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
4539a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
45400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
4541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45437a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
4544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4545e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
454688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
45473af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
45483af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
45494502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
4550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45550d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
4556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45570d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
455888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
4559d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
45600d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
4561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4562b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
456313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
4564b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
4565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45719f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
4572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
45750d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
457687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
457792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4578c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
4579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4581cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4582ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
458309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
4584a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
4585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4588a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
4589a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
4590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4596c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
4597cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
45980ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
4599d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2_trans},
4600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4602c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
4603c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
46044ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
4605cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
4606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
46071d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
46081d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
460909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
4610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
461209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
4613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
461409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
4615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4631094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
4632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
4633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
4634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4635bfcffd4d721d87bb6287980a09e0296ceed0bba3Dave Airlie	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2_trans},
4636332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
4637c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4638c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
46395893e686b691013525cb2608c3d605be2d8ea471Dave Airlie	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
4640c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
4641d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2_trans},
46420196433ce55b7e005c483bd7c411844eb44e983bDave Airlie	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
4643c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
46449a401a2fd6c2d9aa07402e33493be3f014c0fe10Dave Airlie	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
4645c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
46464ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
4647c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
4648c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
4649c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
46504ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
4651850021f225f312d55fb6a24a8cef805f527510afDave Airlie	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
4652c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
4653c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
4654d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2_trans},
46557383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
4656c6a302647200cb0bbc0d0d7680ad4e9fc5dd94bfDave Airlie	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2_swap},
4657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4661cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4662cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4663cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4664cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4665cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4666cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4667cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4668cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4669cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4670cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4671cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4672cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
46739b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_r600_arl},
46749b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
46756b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
467642539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
4677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
467950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
468050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
468198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
468250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
468350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
468450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
46858ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
468650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
4687112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
468850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
468950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
469050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
469150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
469250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
469350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
469450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
469550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
469650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
469750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
469850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
469950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
470050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
470250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
470550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
470850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
470950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4710df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
471150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
471250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
471350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
471450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
471550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
471650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
471750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
471850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
471950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
472050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
472150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
472250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
472350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
472450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
472550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
472650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
472750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
472850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
472950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
473050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
473150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
473250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
473350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
473450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
473550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
473650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
473713c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
473850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
473950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
47467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
47507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
47517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4752c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
47537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
47567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
47577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
47587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
47597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
47637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
47647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4770608a7009d93d589a93a90a4d8edb9fdf360c98a6Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2_trans},
4771cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
47727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
4773d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
47747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4776cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
4777cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
47784ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_imod},
4779cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
47807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
47821d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
47837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
47847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
47877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
47897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
47977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
47997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
48067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
48077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
48087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
480960bf0f05b472e66bf1175fcec7a274dab6f7e2a3Vadim Girlin	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
4810332e1d6d84353b8fac0b9619488b9dc83fe9ace1Vadim Girlin	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_idiv},
4811cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4812cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
4813cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
4814cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
4815d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
4816cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
481760bf0f05b472e66bf1175fcec7a274dab6f7e2a3Vadim Girlin	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2_trans},
4818b69728cba53765f6799a66ebcab2058be6d53602Vadim Girlin	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2_trans},
4819cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
48204ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_udiv},
4821cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
4822cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
4823cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
48244ba4853c0a613f771b44806cd5ce376838479802Vadim Girlin	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umod},
48259b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2_trans},
4826cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
4827cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
4828d84ab821c5f5bfe9f6a57e434af9ca06d54f45b3Vadim Girlin	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
48297383e754b70414b35c10c216034a8dc95f6f67b4Vadim Girlin	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
4830cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
48317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4835cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
4836cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
4837cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
4838cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
4839cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
4840cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
4841cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
4842cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
4843cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
4844cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
4845cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
4846cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
48479b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
48489b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
48496b44470bb2103d5a9c3cf5f2fb4490566971476cVadim Girlin	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
485042539d569a765750e99254ff4db76dfaf014f0e6Vadim Girlin	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
48517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
48537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
48547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
48557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
48567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
48577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
48587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
48597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
48607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
48617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
48627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
48637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
48647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
48657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
48667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
48677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
48687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
48697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
48707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
48717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
48727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
48737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
48747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
48767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
48797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
48827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
4884df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
48857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
48867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
48877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
48887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
48897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
48907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
48927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
48947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
48957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
48967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
48977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
48987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
48997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
49047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
49067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
49077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
49087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
49097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
491113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
49127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
49137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
491952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
492050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
492450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
492550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
4926c8b0b13d40d2686ff34ead1ac98cc98df3530480Marek Olšák	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_LB, tgsi_tex},
492750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
492950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
4930ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
493150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
493250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
493350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
493450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
493650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
493750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
493850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
493950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
494350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4944f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_op2},
4945cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
49460ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
4947f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHL_INT, tgsi_op2},
494850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
494950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4950f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
4951f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
495250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4953cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
495450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
49551d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
49561d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
495750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
495850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
495950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
496150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
496350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
496550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
496950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
497150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
497950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
498050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
498150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
498250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4983f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
498450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4985cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
4986cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
4987f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
4988f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
4989f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ASHR_INT, tgsi_op2},
4990f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
4991f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_UINT, tgsi_op2},
4992f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
4993f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
499450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4995f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
4996f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
4997f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
499850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
4999f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_INT, tgsi_op2},
5000f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
5001f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
5002f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LSHR_INT, tgsi_op2},
5003f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_UINT, tgsi_op2_swap},
5004f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
500550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
500650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
500750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
500850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
5009cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
5010cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
5011cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
5012cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
5013cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
5014cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
5015cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
5016cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
5017cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
5018cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
5019cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
5020cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
5021f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_UARL,      0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
50229b34cea7e91f90023ca3490603155d758cbdee1cDave Airlie	{TGSI_OPCODE_UCMP,      0, 0, tgsi_unsupported},
5023f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_IABS,      0, 0, tgsi_iabs},
5024f01431d0358ae337227a348e96b30adfd8d55f7cDave Airlie	{TGSI_OPCODE_ISSG,      0, 0, tgsi_issg},
502550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
502650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
5027