r600_shader.c revision 1d52ddc3bba276451fdd690a5e9f430505278062
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
607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
61dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs,
621235becaa1cf7e29f580900592563c3329d326deJerome Glisse				struct r600_shader *ps, int id)
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader_io *input = &ps->input[id];
651235becaa1cf7e29f580900592563c3329d326deJerome Glisse
661235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (int i = 0; i < vs->noutput; i++) {
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (input->name == vs->output[i].name &&
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse			input->sid == vs->output[i].sid) {
691235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return i - 1;
701235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
731235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
741235becaa1cf7e29f580900592563c3329d326deJerome Glisse
75a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
761235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
771235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
781235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
79843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	uint32_t *ptr;
80843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano	int	i;
811235becaa1cf7e29f580900592563c3329d326deJerome Glisse
821235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
842f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich		/* use PIPE_BIND_VERTEX_BUFFER so we use the cache buffer manager */
852f0b44f981d1715b62b189f465546d865b10d0f3Mathias Fröhlich		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_IMMUTABLE);
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
871235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
881235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
89ab630b5768b0bfa4d7729d110ce4fb8f42e0cfb9Marek Olšák		ptr = (uint32_t*)r600_bo_map(rctx->radeon, shader->bo, rctx->ctx.cs, PIPE_TRANSFER_WRITE);
90d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		if (R600_BIG_ENDIAN) {
91d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			for (i = 0; i < rshader->bc.ndw; ++i) {
92d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet				ptr[i] = bswap_32(rshader->bc.bytecode[i]);
93d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			}
94d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet		} else {
95d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet			memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * sizeof(*ptr));
96843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano		}
97294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
991235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
1024f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
1094f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet		if (rctx->chip_class >= EVERGREEN) {
1101235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
1171235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1181235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1191235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1201235becaa1cf7e29f580900592563c3329d326deJerome Glisse
121eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader);
1223b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
123eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1241235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
125052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse
129c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	/* Would like some magic "get_bool_option_once" routine.
130c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	*/
131c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	if (dump_shaders == -1)
132c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
133052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
134052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
135052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
136eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		tgsi_dump(shader->tokens, 0);
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{
157041ed559e11ee99d720c8132428c07d8fe57ec81Marek Olšák	r600_bo_reference(&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;
184077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned				ar_reg;
1852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
1864a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode				*bc;
1872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
18840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	struct r600_shader_src			src[4];
189cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
190cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
191e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
192fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
193fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
194fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
195fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
196fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
1972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
1982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
1992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
2032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
2042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[], cm_shader_tgsi_instruction[];
20742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
221c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
222a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
227a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
2298260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
2308260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
2318260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
23647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
244fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
24550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
24650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
2474a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
248fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
249fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
250fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
251fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
252fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
253fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
254fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
255fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
256fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
257fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
258fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
259fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
260fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
261fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
262fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
263fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
264fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
265fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
266fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
2677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
268fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
269fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
270fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
27150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
2734a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
281fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
286fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
287fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
288fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
29150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
29450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
2954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
29650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
29750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
29850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
29950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
3007ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
30472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
30796bbc627f369c0100b950f81531b1fe9ef586c34Christian König	int r;
30872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
31435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
3158a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
31789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) {
31850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
319fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
320fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
321fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
322fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
323fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
324fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
32550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
33235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
333dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
334dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher			/* these don't count as vertex param exports */
335dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher			if ((ctx->shader->output[i].name == TGSI_SEMANTIC_POSITION) ||
336dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher			    (ctx->shader->output[i].name == TGSI_SEMANTIC_PSIZE))
337dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher				ctx->shader->npos++;
338dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher		}
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
34233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
34347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
34596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
346c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	case TGSI_FILE_SYSTEM_VALUE:
347c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) {
3484a47662beaa2092447939db7880531fb706afeddMarek Olšák			struct r600_bytecode_alu alu;
3494a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
35096bbc627f369c0100b950f81531b1fe9ef586c34Christian König
351c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT);
352c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].sel = 0;
353c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.src[0].chan = 3;
35496bbc627f369c0100b950f81531b1fe9ef586c34Christian König
35596bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.sel = 0;
35696bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.chan = 3;
35796bbc627f369c0100b950f81531b1fe9ef586c34Christian König			alu.dst.write = 1;
358c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			alu.last = 1;
35996bbc627f369c0100b950f81531b1fe9ef586c34Christian König
3604a47662beaa2092447939db7880531fb706afeddMarek Olšák			if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
361c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse				return r;
362c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse			break;
363c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		}
36496bbc627f369c0100b950f81531b1fe9ef586c34Christian König
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
37072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
37172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
372be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
373be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
374be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
375be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
376be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
3777ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
379fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
380fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
381fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
382fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
384fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
385fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
387fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
388fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
389fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
390fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
395fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
396fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
397fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
398fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
399fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
400fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
401fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
404fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
405fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
406fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
407fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
408fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
409fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
410fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
411fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
412fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
413fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
414fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
421fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
422fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
423fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
4241fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
4251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
4261fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		     struct r600_shader_src *r600_src)
4271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet{
4281fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
4291fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
4301fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
4311fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
4321fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
4331fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->neg = tgsi_src->Register.Negate;
4341fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r600_src->abs = tgsi_src->Register.Absolute;
43596bbc627f369c0100b950f81531b1fe9ef586c34Christian König
4361fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
4371fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		int index;
4381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if ((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
4391fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
4401fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
4411fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
4421fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
4434a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
4441fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
4451fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet				return;
4461fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		}
4471fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		index = tgsi_src->Register.Index;
4481fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
4491fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
45096bbc627f369c0100b950f81531b1fe9ef586c34Christian König	} else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
451c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		/* assume we wan't TGSI_SEMANTIC_INSTANCEID here */
452c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[0] = 3;
453c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[1] = 3;
454c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[2] = 3;
455c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->swizzle[3] = 3;
456c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse		r600_src->sel = 0;
457c33e091d17b90df61f7b3873a2f124c4f26adf06Jerome Glisse	} else {
4581fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		if (tgsi_src->Register.Indirect)
4591fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet			r600_src->rel = V_SQ_REL_RELATIVE;
4601fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel = tgsi_src->Register.Index;
4611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
4621fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	}
4631fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet}
4641fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
465077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeetstatic int tgsi_fetch_rel_const(struct r600_shader_ctx *ctx, unsigned int offset, unsigned int dst_reg)
466077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet{
4674a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_vtx vtx;
468077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	unsigned int ar_reg;
469077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	int r;
470077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
471077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	if (offset) {
4724a47662beaa2092447939db7880531fb706afeddMarek Olšák		struct r600_bytecode_alu alu;
473077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
474077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
475077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
476077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT);
477077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
478077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
479077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
480077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[1].value = offset;
481077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
482077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = dst_reg;
483077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
484077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
485077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
4864a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
487077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
488077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
489077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = dst_reg;
490077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	} else {
491077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		ar_reg = ctx->ar_reg;
492077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	}
493077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
494077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&vtx, 0, sizeof(vtx));
495077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.fetch_type = 2;		/* VTX_FETCH_NO_INDEX_OFFSET */
496077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.src_gpr = ar_reg;
497077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.mega_fetch_count = 16;
498077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_gpr = dst_reg;
499077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_x = 0;		/* SEL_X */
500077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_y = 1;		/* SEL_Y */
501077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_z = 2;		/* SEL_Z */
502077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.dst_sel_w = 3;		/* SEL_W */
503077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.data_format = FMT_32_32_32_32_FLOAT;
504077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.num_format_all = 2;		/* NUM_FORMAT_SCALED */
505077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.format_comp_all = 1;	/* FORMAT_COMP_SIGNED */
506077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	vtx.srf_mode_all = 1;		/* SRF_MODE_NO_ZERO */
507d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet	vtx.endian = r600_endian_swap(32);
508077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5094a47662beaa2092447939db7880531fb706afeddMarek Olšák	if ((r = r600_bytecode_add_vtx(ctx->bc, &vtx)))
510077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		return r;
511077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
512077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	return 0;
513077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet}
514077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
5157687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx)
5167687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
5177687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5184a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
5197687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nconst, r;
5207687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5217687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
5227687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
5237687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nconst++;
5247687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5257687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		tgsi_src(ctx, &inst->Src[i], &ctx->src[i]);
5267687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5277687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
528077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (inst->Src[i].Register.File != TGSI_FILE_CONSTANT) {
529077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			continue;
530077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		}
531077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
532077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		if (ctx->src[i].rel) {
533077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			int treg = r600_get_temp(ctx);
534077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			if ((r = tgsi_fetch_rel_const(ctx, ctx->src[i].sel - 512, treg)))
535077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet				return r;
536077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
537077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].sel = treg;
538077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			ctx->src[i].rel = 0;
539077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			j--;
540077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		} else if (j > 0) {
5417687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
5427687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
5434a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5447687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
5457687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
5467687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
5477687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].rel = ctx->src[i].rel;
5487687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
5497687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
5507687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
5517687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
5527687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
5534a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
5547687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
5557687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
5567687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
5577687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
5587687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].rel =0;
5597687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
5607687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5617687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5627687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
5637687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
5647687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5657687eabaa0470261e059a2d6502628fffd209345Henri Verbeet/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
5667687eabaa0470261e059a2d6502628fffd209345Henri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx)
5677687eabaa0470261e059a2d6502628fffd209345Henri Verbeet{
5687687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5694a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
5707687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	int i, j, k, nliteral, r;
5717687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
5727687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
5737687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
5747687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			nliteral++;
5757687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5767687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5777687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
5787687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		if (j > 0 && ctx->src[i].sel == V_SQ_ALU_SRC_LITERAL) {
5797687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			int treg = r600_get_temp(ctx);
5807687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			for (k = 0; k < 4; k++) {
5814a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
5827687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
5837687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].sel = ctx->src[i].sel;
5847687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].chan = k;
5857687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.src[0].value = ctx->src[i].value[k];
5867687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.sel = treg;
5877687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.chan = k;
5887687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				alu.dst.write = 1;
5897687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (k == 3)
5907687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					alu.last = 1;
5914a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
5927687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				if (r)
5937687eabaa0470261e059a2d6502628fffd209345Henri Verbeet					return r;
5947687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			}
5957687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			ctx->src[i].sel = treg;
5967687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			j--;
5977687eabaa0470261e059a2d6502628fffd209345Henri Verbeet		}
5987687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	}
5997687eabaa0470261e059a2d6502628fffd209345Henri Verbeet	return 0;
6007687eabaa0470261e059a2d6502628fffd209345Henri Verbeet}
6017687eabaa0470261e059a2d6502628fffd209345Henri Verbeet
602eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlinstatic int r600_shader_from_tgsi(struct r600_pipe_context * rctx, struct r600_pipe_shader *pipeshader)
60372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
604eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct r600_shader *shader = &pipeshader->shader;
605eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	struct tgsi_token *tokens = pipeshader->tokens;
606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
6075555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
6094a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_output output[32];
610457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
612feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	int i, j, r = 0, pos0;
61372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
6164a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_init(ctx.bc, rctx->chip_class);
617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
622f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
624eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	shader->clamp_color = (((ctx.type == TGSI_PROCESSOR_FRAGMENT) && rctx->clamp_fragment_color) ||
625eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		((ctx.type == TGSI_PROCESSOR_VERTEX) && rctx->clamp_vertex_color));
626eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
627feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	shader->nr_cbufs = rctx->nr_cbufs;
628feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
630076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
631076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
632076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
633f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
634f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
635f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
637076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
638076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
639076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
640076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
65589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class >= EVERGREEN) {
6564a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
657f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
6584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
659f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
66189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chip_class >= EVERGREEN) {
662fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
66384457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
6654d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_INPUT] + 1;
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
6674d23c6df81639057f12a604556121aa7b41d921cChristian König						ctx.info.file_max[TGSI_FILE_OUTPUT] + 1;
668d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
66997e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
67097e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
67197e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
672d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
6737728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
674077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	ctx.ar_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
6754d23c6df81639057f12a604556121aa7b41d921cChristian König			ctx.info.file_max[TGSI_FILE_TEMPORARY] + 1;
676077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	ctx.temp_reg = ctx.ar_reg + 1;
677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
678cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
679cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
6805555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
686cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
687cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
688cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
689cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
690cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
691cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
692cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
693cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
694cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
695cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
696de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
706be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
707be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
708be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
7091fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet
7107687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
7117687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_constant(&ctx)))
7127687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
7137687eabaa0470261e059a2d6502628fffd209345Henri Verbeet			if ((r = tgsi_split_literal_constant(&ctx)))
7147687eabaa0470261e059a2d6502628fffd209345Henri Verbeet				goto out_err;
71589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			if (ctx.bc->chip_class == CAYMAN)
7167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				ctx.inst_info = &cm_shader_tgsi_instruction[opcode];
71789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet			else if (ctx.bc->chip_class >= EVERGREEN)
71850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
71950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
72050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
725876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
7265555cd776b970bce020be59193054474a2a63317Dave Airlie			property = &ctx.parse.FullToken.FullProperty;
7275555cd776b970bce020be59193054474a2a63317Dave Airlie			if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
7285555cd776b970bce020be59193054474a2a63317Dave Airlie				if (property->u[0].Data == 1)
7295555cd776b970bce020be59193054474a2a63317Dave Airlie					shader->fs_write_all = TRUE;
7305555cd776b970bce020be59193054474a2a63317Dave Airlie			}
731876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
738eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
739457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
740eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
741eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* clamp color outputs */
742eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	if (shader->clamp_color) {
743eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		for (i = 0; i < noutput; i++) {
744eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			if (shader->output[i].name == TGSI_SEMANTIC_COLOR ||
745eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				shader->output[i].name == TGSI_SEMANTIC_BCOLOR) {
746eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
747eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				int j;
748eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				for (j = 0; j < 4; j++) {
7494a47662beaa2092447939db7880531fb706afeddMarek Olšák					struct r600_bytecode_alu alu;
7504a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
751eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
752eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					/* MOV_SAT R, R */
753eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.inst = BC_INST(ctx.bc, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
754eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.sel = shader->output[i].gpr;
755eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.chan = j;
756eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.write = 1;
757eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.dst.clamp = 1;
758eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].sel = alu.dst.sel;
759eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					alu.src[0].chan = j;
760eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
761eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (j == 3) {
762eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						alu.last = 1;
763eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					}
7644a47662beaa2092447939db7880531fb706afeddMarek Olšák					r = r600_bytecode_add_alu(ctx.bc, &alu);
765eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin					if (r)
766eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin						return r;
767eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin				}
768eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin			}
769eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin		}
770eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	}
771eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
772eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin	/* export output */
773feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	j = 0;
774457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
7754a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&output[i], 0, sizeof(struct r600_bytecode_output));
776feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].gpr = shader->output[i].gpr;
777feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].elem_size = 3;
778feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_x = 0;
779feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_y = 1;
780feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_z = 2;
781feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].swizzle_w = 3;
782feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].burst_count = 1;
783feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].barrier = 1;
784feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
785feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].array_base = i - pos0;
786feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher		output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
787457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
790feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 60;
791feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
795457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
796feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
797feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
798457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
799457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
801de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
802de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
804feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = shader->output[i].sid;
805feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
8064f7dfd8ad3185f006e7ae8ed86bafd4d66ebc903Henri Verbeet				if (shader->fs_write_all && (rctx->chip_class >= EVERGREEN)) {
807feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					for (j = 1; j < shader->nr_cbufs; j++) {
8084a47662beaa2092447939db7880531fb706afeddMarek Olšák						memset(&output[i + j], 0, sizeof(struct r600_bytecode_output));
809feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].gpr = shader->output[i].gpr;
810feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].elem_size = 3;
811feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_x = 0;
812feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_y = 1;
813feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_z = 2;
814feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].swizzle_w = 3;
815feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].burst_count = 1;
816feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].barrier = 1;
817feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].array_base = shader->output[i].sid + j;
818feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
819feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher						output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
820feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					}
821feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher					j--;
822feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				}
8235f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
824feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
825feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 2;
826feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 7;
827feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
828feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
82939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
830feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].array_base = 61;
831feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_x = 7;
832feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_y = 1;
833feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].swizzle_z = output[i + j].swizzle_w = 7;
834feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher				output[i + j].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
84572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
846457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
847feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	noutput += j;
848457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
849457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
850457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
851457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
852457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
853457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
854457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
855457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
856457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
8574a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&output[i], 0, sizeof(struct r600_bytecode_output));
858457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
859457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
860457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
861457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
862457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
863457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
8648ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
865457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
866457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
867457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
8687e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
869457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
871c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
872481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
873481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
8744a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&output[0], 0, sizeof(struct r600_bytecode_output));
875481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
876481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
877481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
878481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
879481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
880481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
8818ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
882481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
883608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
884481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
885a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
886481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
887481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
888457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
889457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
89089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx.bc->chip_class < CAYMAN) {
8917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (i == (noutput - 1)) {
8927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				output[i].end_of_program = 1;
8937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
894457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
895b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
896b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
897a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
898c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
899c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
900457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
901457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
9024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_output(ctx.bc, &output[i]);
903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
904de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
9067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* add program end */
90789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx.bc->chip_class == CAYMAN)
9084a47662beaa2092447939db7880531fb706afeddMarek Olšák		cm_bytecode_add_cf_end(ctx.bc);
9097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
9103b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
914cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
921f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák	R600_ERR("%s tgsi opcode unsupported\n",
922f8279fb9d82cbbbbaf8a5cc26486142c21d4d2d2Marek Olšák		 tgsi_get_opcode_name(ctx->inst_info->tgsi_opcode));
923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9314a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src(struct r600_bytecode_alu_src *bc_src,
932a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
933a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
934a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
935a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
936a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
937a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
938a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
939a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
940a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
941a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
942a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
9434a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_set_abs(struct r600_bytecode_alu_src *bc_src)
944f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin{
945f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->abs = 1;
946f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	bc_src->neg = 0;
947f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin}
948f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin
9494a47662beaa2092447939db7880531fb706afeddMarek Olšákstatic void r600_bytecode_src_toggle_neg(struct r600_bytecode_alu_src *bc_src)
9503efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin{
9513efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin	bc_src->neg = !bc_src->neg;
9523efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin}
9533efb47f0b0557a6b96a7e41b27725cea4736a061Vadim Girlin
95480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
95580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
95680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
9574a47662beaa2092447939db7880531fb706afeddMarek Olšák		     struct r600_bytecode_alu_dst *r600_dst)
958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
9597a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9607a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
96547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
96647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
9677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
9687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
9697a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
972dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
973de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
974dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
977dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
978d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
979d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
980d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
981dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
982dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
983dffad730df17983cfaef0808555a8c26cad0aa15Christian König
984cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_int_to_flt(struct r600_shader_ctx *ctx)
985cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
986cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
987cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
988cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
989cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
990cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
991cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
992cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
993cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
994cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
995cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
996cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
997cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
998cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
999cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1000cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1001cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1002cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.last = 1;
1003cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1004cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1005cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1006cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1007cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1008cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1009cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1010dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
1011dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
1012dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10134a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1014dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
1015dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1017d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1018d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1019d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1020d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
10214a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
102280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1024d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1025d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
10274a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1029d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
10304a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
10314a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1033de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1035de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
10364a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
10387a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
10394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
10407a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1044d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
10474a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1054d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1055d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1056d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
1057d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1058d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1059d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1060d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1061d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
1062d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1063d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1064cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_ineg(struct r600_shader_ctx *ctx)
1065cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
1066cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1067cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
1068cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, r;
1069cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1070cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1071cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1072cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1073cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1074cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
1075cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1076cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1077cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1078cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_0;
1079cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1080cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1081cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1082cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1083cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1084cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
1085cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
1086cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
1087cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
1088cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
1089cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
1090cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
1091cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
1092cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
1093cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
1094cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
10957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
10967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
10977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
10994a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
11007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
11017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
11034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
11047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
11057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
11064a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
11077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
11087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
11107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
11127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
11134a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
11147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
11157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
11167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
11177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
11187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
11197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
112188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
11251fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
112688f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
112796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
112896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
112996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
113096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
113196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
11324a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
11337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
11344a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1135a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
113688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
113788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
113888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
113988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
114088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
114188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
11424a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
11437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1144921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
114588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1146a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
114796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1148ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
114988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
11504a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
115188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
115288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
115388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
11544a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1155a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
11567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
115788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
115888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
115988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
116088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
116188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
116288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
116388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
11644a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
116588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
116688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
116788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
11684a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1169a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
117088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
117188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
117288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
117388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
117488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
117588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
117688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
117788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
11787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1179921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1181921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1182ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
118396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
118489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1185a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1186a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
118796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
118896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
118996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
119096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
119196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
119296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
119388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
11944a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
119588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
119792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
119892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
119992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
12007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
12017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
12027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12034a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
12047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
12057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
12067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
12087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
12097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
12107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
12134a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
12157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
12167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
12197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
12217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
12227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
12237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
12244a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
12257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
12267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
12277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
12287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
12297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
12307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
123192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
123292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
123392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12344a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
123592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1236dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
123792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
12381fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
123992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
124092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
124188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
12424a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
124388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
124488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
124588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
124688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
124788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
124888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
124988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
125088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
12514a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
125288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
125388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
125488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
125588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1256be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1257be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1258be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1259be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
12604a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1261a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1262be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1263be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
126480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1265be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
126688f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
12674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
126888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
126988f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
127088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
127188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
127288f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
127388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
127492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
127592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
127692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12774a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
12787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
127992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
128057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
128157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
128257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
128357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
12841fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
128557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
128657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
128757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
128892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
128992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
129057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
129189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
12927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
12934a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
12957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
12987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
12997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
13007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
13027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
13037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
13047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13054a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
13067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
13104a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
13127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
131392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
13147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
13157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
13167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13174a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
13187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
13197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
13207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
132157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
132292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
132392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
132457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
132589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
13267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
13274a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
13297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
13317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
13327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
13337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
13347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
13357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
13367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
13377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
13384a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
13397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
13407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
13417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
13427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
13434a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
13447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
13457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
134657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
13477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
13487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
13497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
13504a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
13517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
13527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
13537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
135457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
135592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1356ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1357ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
13584a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1359ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1360ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1361ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
136280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1363ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1364ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1365ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1366ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1367ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1368ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
13694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1370ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1371ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1372ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1373ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1374ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1375ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
13764a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1377ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1378ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1379ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
138080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1381ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1382ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1383ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1384ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1385ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1386ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
13874a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1388ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1389ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1390ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1391ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
139292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
139392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
139492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1395094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1396094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
13974a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1398094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1399094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1400094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
14014a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1402094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
14034502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1404094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
14054502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1406921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
14074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
14084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
14094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
14104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
14114502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
14124a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
14134502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1414094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1415094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1416094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
14174a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1418094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1419094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1420094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
14214502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
14224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
14234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
14244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1425094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1426094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1427094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
14280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
14290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
14300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14314a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
14320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
14330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1434f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
14354a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1436f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
14374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
1438f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1439f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
1440f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1441f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
1442f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
1443f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
1444f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1445f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
14464a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1447f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
1448f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
1449f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
14500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
14510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
14526a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
14536a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
14547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
14556a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
145689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
14577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
1458f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
14594a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1461f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
1462f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
1463f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
1464f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
14657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
14667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
14677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
14687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
14697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
14707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14714a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
14727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
14737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
14747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
14757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
1476f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
14774a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1479f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
1480f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
14812fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
14822fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
14832fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
14847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14854a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
14867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
14890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14906a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
14916a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
14920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
149386f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
14944a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1495a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
149686f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
149786f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
14984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
14994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
15000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
15010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
15020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
15030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
15040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
15054a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
15060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
15070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
15080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
150989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
15107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
15117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
15124a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
15147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
15157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
15167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
15187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
15197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
15207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
15217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
15224a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
15237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
15247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
15257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
15267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
15277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
15284a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
15307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
15317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
15327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
15337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
15344a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
15357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
15367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
15377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
15380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1539abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
15408567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
15414a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15428567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
15438567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
15448567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
15458567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
15468567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
15474a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
15488567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
15498567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
15508567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
1551abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
15524a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1553abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
15544a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1555abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1556abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1557abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1558abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
15594a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1560abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1561abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1562abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1563abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
15644a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1565abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1566abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1567abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1568abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1569abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1570abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
15714a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1572abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1573abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1574abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
15750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
15760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
15770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
157842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
157942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
158042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15814a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
158242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
158342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
15844a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1585df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1586df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1587df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1588df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1589df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1590df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1591df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
159242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
15934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
15944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
159542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
159642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
159742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
159842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
15994a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
160042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
160142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
160242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
160342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
160442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
160542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1606a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
16077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
16087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16094a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1610a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
16117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
16127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
16134a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1615a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
16167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
161780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
16197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
16207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
16214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
16227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
16237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
16247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
16257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
16267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
16277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1628a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1629a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1630a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16314a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1632a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1633a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
16344a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1635a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1636a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
16374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
1638a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1639a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1640a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1641a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
16424a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1643a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1644a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1645a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1646a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1647a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1648a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
16497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
16507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
16517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
16534a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
16547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
16557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
16574a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
16594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
16607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
16617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
16627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
16637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
16647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
16667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
16677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
16687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
16697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
16714a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
16734a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
16747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
16757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
16767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
16777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
16784a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
16797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
16807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
16817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
16837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
16844a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
16867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
16877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
16907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
16917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
16937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
16947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
16957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
16967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
16977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
16987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1699a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1700a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
17014a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1702a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1703a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1704a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
17054a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1706a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
17074a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1708a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1709a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1710a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
17114a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1712a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1713a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1714a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
17154a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
171666f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
17174a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
1718a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1719a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1720a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1721a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
17224a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1723a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1724a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1725a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
17264a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1727a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1728a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1729a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1730a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1731a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
17324a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1733a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1734a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1735a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1736a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1737a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
17380d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
17390d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
17400d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17414a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1742921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
17430d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17440d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
17450d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
17464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1747a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
17480d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1749cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
17500d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1751cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
17520d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
1754921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
17554a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
17560d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17570d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
17580d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
17594a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17600d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
17610d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
17620d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
17630d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17640d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
17650d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
17664a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1767a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
17680d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
176980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17700d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17710d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1772cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
17730d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
17740d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1775921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
17760d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
17770d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17780d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1779cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
17800d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17810d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
17820d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
17834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17840d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
17850d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
17860d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
17870d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
17880d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
17890d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
17924a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1793cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1794cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1795cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
17964a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1797cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1798a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
17996c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1800cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1801a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
180280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1803cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1804cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1805cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1806cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1807cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1808cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
18094a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1810cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1811cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1812cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1813cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1814cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1815cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18194a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1821dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
18237be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
18247be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
18257be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
18267be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
18274a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18304a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18327be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
183380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1835cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
18377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18404a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
18447be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1845cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1846cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1847cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1848cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1849cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18504a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1851cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1852cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
18544a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1855cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1856cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1858cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1859a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
186080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1861cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1862a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1863cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1864cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1865cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1866cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1867921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1868cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1869cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1870cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1871cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1872cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1873921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1874cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1875cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1876cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1877e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1878e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1879e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1880e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1881e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1882e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1883e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1884cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1885cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1887de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18904a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
18947be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
18976415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
18986415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
18996415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
19006415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19016415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
19026415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
19036415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
19046415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
19056415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
19066415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
19076415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
19086415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
19096415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19106415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
19116415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
19126415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
191333241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
191433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
191596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
191633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19174a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
19184a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1919641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
192040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1922da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
1923da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
19246415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
192578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
192613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
19271d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	u8 offset_x = 0, offset_y = 0, offset_z = 0;
1928641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
19296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
1930641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
19311d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
19321d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		/* get offset values */
19331d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		if (inst->Texture.NumOffsets) {
19341d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			assert(inst->Texture.NumOffsets == 1);
19351d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie
19361d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_x = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleX] << 1;
19371d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_y = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleY] << 1;
19381d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie			offset_z = ctx->literals[inst->TexOffsets[0].Index + inst->TexOffsets[0].SwizzleZ] << 1;
19391d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie		}
19401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
194113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
194213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
194313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
194440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
194540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
19464a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
194740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
194840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
194940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
195040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
195140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
195240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
195340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
195440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
195540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
195640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
195740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
195840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
195940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
19604a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
196140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
19624a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
196340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
196440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
196540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
196640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
196740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
19684a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
196940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
197040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
197140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
197213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
197340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
197440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
197540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
197640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
197740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
197840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
197940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
198040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
198140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
198240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
198340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
198440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
198540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
198640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
198740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
198840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
19894a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
199040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
199140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
199213c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
199313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
19947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
1995b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
199689dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
19977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
19987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
19994a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20014a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
2002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
20037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
20047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
20057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
20087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20094a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
20164a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20184a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
20244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
20257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
20289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
2029b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
20304a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2031a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2032b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
20337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
20344a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
2035b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2036b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2037b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
20384a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2039b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2040b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2041b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
20424a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2043a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2044921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2045b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
2046b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
2047b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
2048b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
2049b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
20504a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2051b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
2052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
205378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2054b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2055bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2056bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2057bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
20580e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
20590e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
2060bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2061bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
2062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
20634a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2064a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
20654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
20664a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
2067bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
2068bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
2069bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
2070bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
2071bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
20724a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2073bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
2074bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
2075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
2076bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2077bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
207889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
20804a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
20847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
20857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
20867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
20877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20914a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20964a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
20997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
21007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
21017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
21027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
21037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
21047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
21054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
21067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
21077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
21087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
21097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2110bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
2111bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
21127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
2113bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
21144a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2115a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2116bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2117bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2118bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2119bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
2120bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2121bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
21227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2123bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2124bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2125a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2126bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2127bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2128bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
2129bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2130bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
21314a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2132bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2133bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2134bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
21354a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2136a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2137bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2138bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2139bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2140bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
2141bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2142bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
21437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2144bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2145bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2146a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2147bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2148bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2149bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
2150bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2151bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2152bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
21534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2154bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2155bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2156bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
215778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2158bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
2159bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2160bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
216178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
2162b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
21634a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2164a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
21654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2166b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2167b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2168b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
2169b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
2170b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
21714a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2172b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2173b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2174b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
217578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2176b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2177b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
21787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2179bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2180de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) {
2181de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
2182de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
2183de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
2184de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2185de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
2186de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
2187de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2188de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
2189de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
2190de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2191de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
2192de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
219333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
21944a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
2195bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
21966415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
21976415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
2198077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
2199641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
22006c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
22019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
22029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
22039d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
22049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
220578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
220678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
220778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
220878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
220978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
221078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
221178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
221278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
221378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
221478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
2215244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
221678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
22179a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2218bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2219bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2220bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2221bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2222bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2223bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2224bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
222501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
222601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
222701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
22287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
222901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
223001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
2231bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
22321d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_x = offset_x;
22331d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_y = offset_y;
22341d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	tex.offset_z = offset_z;
223569d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) {
223669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
223778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = tex.src_sel_y;
223869d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY)
223969d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
224069d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2241bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
224278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2243bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
22444a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
2245bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2246bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2247bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2248bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2249bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
225033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
225133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2252b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2253b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2254b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2256dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2257b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2258b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2259b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2260c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
22611fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2262c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2263c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2264c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2265c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
22664a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2267c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
22684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
22694a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2270c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
227180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2272c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2273c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2274c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2275c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
22764a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2277c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2278c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2279c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2280c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2281c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2282c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2283b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2284dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2285dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2286dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2287dffad730df17983cfaef0808555a8c26cad0aa15Christian König
22884a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2289a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2290921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2291b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
22924a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
22934a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
2294b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2295b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2296dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2297b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2298b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2299b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
23004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2301b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2302b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2303b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2304b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2305b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2306dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2307dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2308dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2309dffad730df17983cfaef0808555a8c26cad0aa15Christian König
23104a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2311a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2312b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2313b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
23144a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2315b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2316b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2317dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2318b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2319b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2320b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
23214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2322b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2323b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2324b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2325b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2326b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2327dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2328dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2329dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2330dffad730df17983cfaef0808555a8c26cad0aa15Christian König
23314a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2332a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2333b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
23344a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
23354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2336b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2337b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2338dffad730df17983cfaef0808555a8c26cad0aa15Christian König
233980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2340b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2341dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2342b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2343b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
23444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2345b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2346b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2347b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2348dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2349b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2350b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
235187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
235287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
235387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23544a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
235587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2356dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
235787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
23587be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
23597be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
23607be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
236187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
23624a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2363a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
23644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
23654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
23664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
236780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
236887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
236987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
237087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
23717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
237287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
23734a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
237487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
237587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
23767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
237787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
237887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
237987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
23800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
23810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
23820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23830e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
23840e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
23854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
23860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
23870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
23880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
23900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
23910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
23934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2394a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
23950e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
23964a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
23974a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
23980e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
23990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
24000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
24010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
24020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
24030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
24040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
24060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
24070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
24080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
24100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
24114a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
24130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
24140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
24150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
24174a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2418a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
24190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24200e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
24214a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
24224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
24230e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
24240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
24250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
24260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
24270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
24280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
24290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
24310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
24320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
24330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
24340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
24350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
243680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
243780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
24390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
24400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
24410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
24420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
24434a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
24440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
24450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
24460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
24470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
24480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
24490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
24500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
24510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
245236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
245336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
245436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
24554a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
245609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
24577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
245836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
245936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
246036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
24614a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
246236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2463a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
24644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
246536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
246636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
246736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
246836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
246936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
24704a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
247136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
247236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
247336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
247489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
24757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
24787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
247936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
24807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24864a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
24937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
24947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
24977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
25007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
250336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
25047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
250536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
250636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
25074a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
250836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2509a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
25104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
251136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
251236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2513b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2514b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2515b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2516b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2517b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
251836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
251936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
252036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
252136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
252236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
25234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
252436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
252536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
252636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
252736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
252836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
252936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
253089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
25317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25324a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25344a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
253536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
25367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
25397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
25417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
254236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
25434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
25447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25484a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
25504a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
255136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
25527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
25557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
25577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
25597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
256236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
256336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
256436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
256536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
25664a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
256736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2568a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
256936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
257036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
257136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
257236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
257336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
257436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
257536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
25764a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
257736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
257836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
257936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
258036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
258136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
258287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2583460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2584460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2585460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
25864a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2587460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
25887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2589460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2590f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
2591460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
259289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
25937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25944a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2595460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25974a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
25984a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
25997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
26037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
26064a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
26077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26124a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
26154a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
26164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
26177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
26207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
26224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
26237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2626460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2627460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2628460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2629460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2630460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2631460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2632460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2633460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2634460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2635460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
26364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2637460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2638460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2639460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2640460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2641f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
2642460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2643460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
264489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26464a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
264796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
26494a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
26504a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
265196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
26557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
26587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26594a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
26607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
26637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26644a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
26674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
26684a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
26697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
26727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
26747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26754a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
26767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
267996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26804a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
268196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
268296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
268396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
268496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
268596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
268696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
268796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
268896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
268996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
269096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26914a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
269296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
269396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
269496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
269589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
26967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26974a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
26997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
27007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
27017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
27057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
270896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27094a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
27137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27144a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
27167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
27177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
271896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
27217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
27227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
272396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27244a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
27257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
27267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
27277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
272896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
272989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27314a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
27337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
27347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
27357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
27397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
27427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27434a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
27477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27484a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
27507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
27517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
275296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
27557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
27567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
275796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27584a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
27597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
27607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
27617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
276296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27634a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
276496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
276596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
276696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
27674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27684a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
276996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
277096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
277196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2772460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2773460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2774460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2775460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2776460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2777460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27784a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2779460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2780460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2781460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2782460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2783f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
2784460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
278589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27874a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2788460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27904a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27914a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
2792460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
2799460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28004a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
28017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
28027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
28037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
28047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
28054a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
28067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
28084a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
28094a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
28107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
28127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
28137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
28147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
28157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
28164a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
28177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
28187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
28197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2820460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2821460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2822460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2823460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
28244a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2825460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2826460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2827460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2828460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2829460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2830460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2831460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2832460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2833460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2834460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
28354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2836460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2837460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2838460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2839460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2840460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2841460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2842460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
284398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
284498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
284598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
28464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
284798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
2848a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
28494a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
285098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
285152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
285252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
285352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
285452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
285552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
285652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
285752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
285852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
285952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
286052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
286152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
286252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
28634a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
286498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2865077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.dst.sel = ctx->ar_reg;
286698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
28674a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
286898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
286998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
2870077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2871077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	/* TODO: Note that the MOVA can be avoided if we never use AR for
2872077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * indexing non-CB registers in the current ALU clause. Similarly, we
2873077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * need to load AR from ar_reg again if we started a new clause
2874077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * between ARL and AR usage. The easy way to do that is to remove
2875077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * the MOVA here, and load it for the first AR access after ar_reg
2876077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * has been modified in each clause. */
28774a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
287898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2879077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
288098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
288198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
28824a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
288398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
288498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
288598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
288698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
288798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
288847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
288947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
289047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
28914a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
289247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
2893a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
28947ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
28957ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
2896077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2897077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
28984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2899077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2900077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2901077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2902077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
29034a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2904077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
2905077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2906077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2907077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2908077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
2909077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2910077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2911077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2912077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
29134a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2914077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
29157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
29167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
2917077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2918077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
29194a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2920077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2921077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2922077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2923077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
29244a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2925077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
29267ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
29277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
29287ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
29297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
29307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
29317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2932077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&alu, 0, sizeof(alu));
2933077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2934077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
293547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
293647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
29374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
293847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
293947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2940c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
294147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
294247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
294347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
294457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
294557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
294657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
29474a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
294857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
294957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
295057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
29514a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
295257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2953a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
295480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
29557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
29567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
295757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
295857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
29594a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
296057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
296157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2962a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
296357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
296457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
29654a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
296657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
296757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
296857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
29694a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
297057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
297157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
297257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
297357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
297457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
297557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2976a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2977a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
29784a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2979a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2980a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
29814a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2982a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2983a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2984a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2985a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2986a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2987a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2988a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
29894a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2990a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2991a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
29927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2993a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2994a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
29954a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2996a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2997a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2998a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2999a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3000a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3001a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
3002a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
30032bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
30042bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
30052bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
30062bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
30072bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
30082bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
30092bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
30102bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
30112bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
30122bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
30132bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
30142bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
30152bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
30162bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
30172bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
30182bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
30192bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
30202bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
30212bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
30222bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
30232bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
30242bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
30252bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
30264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
30278813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
30288813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
30298813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
30302bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
3031a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3032a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3033a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
303409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
3035a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
303609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
303709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
303809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
303909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
304009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
304109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
304209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
304309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
304409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
304509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
304609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
304709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
304809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
304909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3050a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
305109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
305209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
305309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
305409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
305509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
305609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
305709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
305809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
305909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
306009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
306109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
3062a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
3063a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
3064a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
306509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
306709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
306809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
307009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
307109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
30727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
307309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
307409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
307509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
307609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
307709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
307809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
307909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
308009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
308109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
308209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
308309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
308409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
308509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
308609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
308709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
308809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
308909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
309009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
309109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
309209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
309309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
309409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
309509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
309609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
30974a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
30984a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
309909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
310009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
310109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3102a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
310309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
310409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3105a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
310609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
310709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
310809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
310909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
311009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
311109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
311209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
311309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
311409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
311509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
311609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
311709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
311809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
311909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
312009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
312109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
312209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
312309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
312409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
312509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
31264a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
312709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
312809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
312909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
313009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
313109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
313209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
31334a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
313409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
313509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
313609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
313709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3138a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
313909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
314009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
314109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
314309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
314409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
314509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
31467ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
314709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
314809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
314909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
315009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
315109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
315209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
315309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
315409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
315509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
315609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
315709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
315809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
315909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
316009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
316109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
31624a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
316309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
316409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
316509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
316609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
316709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
316909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
317009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
317209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
317409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
31754a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
317609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
317709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
317809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
317909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
3180a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3181a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3182a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3183a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
3184a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
31854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
3186a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
3187a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
318809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
3189a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
3190a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3191a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3192a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3193a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
3194a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
3195a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
3196a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
3197a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
3198a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
3199a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
3200a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3201a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
3202a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
3203a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
3204a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
320509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
3206a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
320709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
320809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
320909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
321009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
321109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
321209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
321309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
321409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
32154a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
321609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
321709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
3218a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
321909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
322009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
322109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
322209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
322309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
322409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
322509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
322609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
322709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
32284a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
322909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
323009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
323109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
323209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
323309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
323409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
323509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
323609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
323709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
323809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
323909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
324009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
324109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
324209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
324309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
324409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
324509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
324609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
324709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
324809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
324909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
325009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
325109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
325209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
325309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
325409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
325509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
325609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
325709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
325809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
325909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
326009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
326109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
326209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
326309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
326409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
326509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
326609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
326709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
32684a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
326909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
327009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
327109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
327209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
327309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
327409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3275a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3276a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3277a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3278cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airliestatic int tgsi_umad(struct r600_shader_ctx *ctx)
3279cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie{
3280cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
3281cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	struct r600_bytecode_alu alu;
3282cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int i, j, r;
3283cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
3284cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3285cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	/* src0 * src1 */
3286cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3287cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3288cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3289cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3290cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3291cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3292cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.chan = i;
3293cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.sel = ctx->temp_reg;
3294cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.dst.write = 1;
3295cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3296cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT;
3297cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		for (j = 0; j < 2; j++) {
3298cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		        r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
3299cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3300cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3301cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
3302cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
3303cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3304cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3305cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3306cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3307cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3308cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3309cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3310cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	for (i = 0; i < lasti + 1; i++) {
3311cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
3312cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			continue;
3313cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3314cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
3315cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
3316cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3317cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT;
3318cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3319cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].sel = ctx->temp_reg;
3320cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		alu.src[0].chan = i;
3321cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3322cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
3323cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (i == lasti) {
3324cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			alu.last = 1;
3325cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		}
3326cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		r = r600_bytecode_add_alu(ctx->bc, &alu);
3327cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie		if (r)
3328cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie			return r;
3329cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	}
3330cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	return 0;
3331cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie}
3332cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie
3333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
333498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
33360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3337df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3338df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3339df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3340df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3341df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3342df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3343df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
334442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
334536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3349cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3350cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
335157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3352dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3354d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3355be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3358b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33663af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33683af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3369df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
33707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
33714558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3372a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
33730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33767a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3378e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
337988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
33803af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
33813af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
33824502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33880d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33900d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
339188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3392d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
33930d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3395b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
339613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
3397b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34049f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34080d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
340987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
341092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3411d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3414cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3415ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
341609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3417a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3421a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3422a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3430cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
34310ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3438cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
3439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34401d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
34411d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
344209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3464094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3472de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3494cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3495cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3496cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3497cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3498cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3499cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3500cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3501cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3502cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3503cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3504cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3505cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
3506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
350850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
350950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
351098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
351150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
351250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
351350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
35148ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
351550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3516112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
351750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
351850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
351950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
352050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
352150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
352250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
352350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
352450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
352550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
352650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
352750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
352850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
352950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
353150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
353450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
353750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
353850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3539df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
354050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
354150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
354250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
354350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
354450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
354550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
354750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
354850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
354950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
355050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
355150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
355250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
355350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
355850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
355950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
356150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
356250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
356350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
356450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
356550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
356613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
356750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
356850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
35757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
35797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
35807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
35817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
35827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
35857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
35867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
35877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
35887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
35897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
35927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
35937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
35947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3599cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_INT_TO_FLT, tgsi_int_to_flt},
3600cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
36017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
36027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3605cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_AND_INT, tgsi_op2},
3606cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_OR_INT, tgsi_op2},
36077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3608cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
36097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36101d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
36111d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
36127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
36137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
36167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
36187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
36357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
36367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
36377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3638cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT, tgsi_op2},
36397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3640cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3641cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
3642cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SUB_INT, tgsi_ineg},
3643cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_INT, tgsi_op2},
36447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3645cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
36467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3647cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_UINT_TO_FLT, tgsi_op2},
3648cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD_INT, tgsi_op2},
36497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3650cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_umad},
3651cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_UINT, tgsi_op2},
3652cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_UINT, tgsi_op2},
36537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3654cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MULLO_UINT, tgsi_op2},
3655cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE_INT, tgsi_op2},
3656cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE_UINT, tgsi_op2},
36577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3658cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT_INT, tgsi_op2_swap},
3659cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE_INT, tgsi_op2},
36607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3664cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3665cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3666cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3667cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3668cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3669cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3670cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3671cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3672cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3673cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3674cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3675cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
36767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
36787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
36797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
36807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
36817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
36827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
36837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
36847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
36857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
36867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
36877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
36887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
36897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
36907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
36917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
36927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
36937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
36947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
36957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
36967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
36977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
36987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
36997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
37077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3709df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
37107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
37117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
37127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
37137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
37147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
37157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
37177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
37197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
37207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
37217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
37227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
37237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
37297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
37317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
37327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
37337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
37347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
373613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
37377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
37387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
373950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
374550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
374850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
374950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
375050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
375150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
375250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
375350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
375450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3755ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
375650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
375750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
375850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
375950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
376050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
376150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
376250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
376350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
376450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
376550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
376650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
376750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
376850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
376950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3770cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOT_INT, tgsi_op2},
37710ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
377250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
377350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
377450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
377550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
377650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
377750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3778cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_XOR_INT, tgsi_op2},
377950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
37801d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXF,	0, SQ_TEX_INST_LD, tgsi_tex},
37811d52ddc3bba276451fdd690a5e9f430505278062Dave Airlie	{TGSI_OPCODE_TXQ,	0, SQ_TEX_INST_GET_TEXTURE_RESINFO, tgsi_tex},
378250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
378350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
378450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
378550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
378650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
378750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
378850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
378950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
379050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
379650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
379950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
380550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
380650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
380750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
380950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3810cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX_INT, tgsi_op2},
3811cdeffbfddceaccaad5d78f5c95426f41dec74fe5Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN_INT, tgsi_op2},
381250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
381950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
382950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
383350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3834cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3835cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3836cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3837cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3838cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3839cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3840cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3841cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3842cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3843cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3844cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3845cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
384650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
384750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3848