r600_shader.c revision cc9a8915f093c57d2748370d18ed47f66c933013
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
984dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
985dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
986dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9874a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
988dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
989dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
991d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
992d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
993d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
994d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
9954a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
99680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
998d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
999d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
10014a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1003d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
10044a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
10054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
10104a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_toggle_neg(&alu.src[1]);
1011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
10127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
10134a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
10147a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1018d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
1019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
10214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1028d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1029d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1030d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
1031d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1032d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1033d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1034d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1035d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
1036d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1037d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
10387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_emit_float_instr(struct r600_shader_ctx *ctx)
10397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
10407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, j, r;
10424a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
10447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0 ; i < last_slot; i++) {
10464a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
10477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
10487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
10494a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], 0);
10507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
10517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
10537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
10557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
10564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
10577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
10587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
10597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
10607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
10617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
10627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
10637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
106688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
10681fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeetstatic int tgsi_setup_trig(struct r600_shader_ctx *ctx)
106988f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
107096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
107196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
107296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
107396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
107496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
10754a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
10767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
10774a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1078a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
107988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
108088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
10854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
10867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1087921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1089a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
109096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1091ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
109288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
10934a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
109588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
109688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
10974a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1098a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
10997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
110088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
110188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
110288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
110488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
110688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
11074a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
110888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
111088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
11114a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1112a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
11217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1122921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1124921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1125ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
112696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
112789dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet	if (ctx->bc->chip_class == R600) {
1128a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1129a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
113096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
113196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
113296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
113396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
113496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
113596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
113688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
11374a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
113888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
113988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
114092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
114192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
114292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
11437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_trig(struct r600_shader_ctx *ctx)
11447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
11457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11464a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
11477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
11487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
11497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	r = tgsi_setup_trig(ctx);
11517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
11527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
11537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
11564a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
11577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
11587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
11597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
11627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
11637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
11647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].chan = 0;
11657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
11667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
11674a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
11687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
11697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
11707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
11717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
11727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
11737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
117492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
117592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
117692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11774a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
117892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1179dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
118092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
11811fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	r = tgsi_setup_trig(ctx);
118292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
118392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
118488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
11854a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
118688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
118788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
118888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
118988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
119088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
119188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
119288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
119388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
11944a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
119588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
119788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
119888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1199be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1200be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1201be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1202be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
12034a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1204a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1205be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1206be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
120780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1208be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
120988f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
12104a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
121188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
121288f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
121388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
121488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
121588f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
121688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
121792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
121892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
121992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12204a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
12217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
122292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
122357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
122457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
122557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
122657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
12271fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet		r = tgsi_setup_trig(ctx);
122857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
122957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
123057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
123192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
123292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
123357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
123489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
12357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
12364a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
12387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
12407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
12417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
12427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
12437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
12447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
12457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
12467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
12477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
12484a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
12497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
12507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
12517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
12527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
12534a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
12557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
125692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
12577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
12587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
12597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
12604a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
12617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
12627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
12637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
126457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
126592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
126692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
126757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
126889dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
12697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0 ; i < 3; i++) {
12704a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
12727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
12747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
12757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				else
12767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
12777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
12787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
12797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
12807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
12814a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
12827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
12837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
12847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
12857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
12864a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
12877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
12887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
128957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
12907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
12917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
12927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
12934a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
12947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
12957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
12967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
129757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
129892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1299ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1300ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
13014a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1302ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1303ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1304ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
130580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1306ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1307ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1308ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1309ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1310ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1311ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
13124a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1313ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1314ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1315ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1316ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1317ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1318ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
13194a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1320ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1321ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1322ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
132380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1324ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1325ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1326ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1327ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1328ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1329ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
13304a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1331ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1332ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1333ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1334ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
133592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
133692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
133792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1338094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1339094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
13404a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1341094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1342094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1343094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
13444a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1345094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
13464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1347094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
13484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1349921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
13504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
13514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
13524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
13534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
13544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
13554a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
13564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1357094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1358094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1359094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
13604a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1361094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1362094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1363094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
13644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
13654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
13664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
13674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1368094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1369094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1370094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
13710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
13720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
13730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
13750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
13760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1377f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	/* tmp.x = max(src.y, 0.0) */
13784a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1379f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
13804a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 1);
1381f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1382f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.src[1].chan = 1;
1383f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1384f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.sel = ctx->temp_reg;
1385f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.chan = 0;
1386f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.dst.write = 1;
1387f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
1388f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	alu.last = 1;
13894a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1390f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin	if (r)
1391f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin		return r;
1392f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin
13930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
13940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
13956a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
13966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
13977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int i;
13986a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
139989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
14007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
1401f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				/* tmp.z = log(tmp.x) */
14024a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1404f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].sel = ctx->temp_reg;
1405f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.src[0].chan = 0;
1406f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.sel = ctx->temp_reg;
1407f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin				alu.dst.chan = i;
14087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
14097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
14107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
14117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
14127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
14137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
14144a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
14157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
14167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
14177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
14187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
1419f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			/* tmp.z = log(tmp.x) */
14204a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1422f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].sel = ctx->temp_reg;
1423f0a7e28e29b5005c20ac02a7eec6511f6d7fd1c4Vadim Girlin			alu.src[0].chan = 0;
14242fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.sel = ctx->temp_reg;
14252fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.chan = 2;
14262fe39b46e73aea37152777fe11d489e0b1bc3f92Vadim Girlin			alu.dst.write = 1;
14277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14284a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
14297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
14320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14336a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
14346a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
14350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
143686f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		/* tmp.x = amd MUL_LIT(tmp.z, src.w, src.x ) */
14374a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1438a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
143986f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].sel  = sel;
144086f8b4117f35c788c8a043c2e241eb19eaacae8cVadim Girlin		alu.src[0].chan = chan;
14414a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], 3);
14424a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], 0);
14430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
14440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
14450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
14460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
14470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
14484a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
14490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
145289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
14537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
14547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				/* dst.z = exp(tmp.x) */
14554a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
14587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
14597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
14617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
14627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
14637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				} else
14647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 0;
14654a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
14667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
14677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
14687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
14697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
14707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			/* dst.z = exp(tmp.x) */
14714a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
14747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
14757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
14767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
14774a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
14787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
14797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
14807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
14810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
1482abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
14838567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	/* dst.x, <- 1.0  */
14844a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
14858567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
14868567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
14878567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.src[0].chan = 0;
14888567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
14898567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
14904a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
14918567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin	if (r)
14928567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin		return r;
14938567e02dca6a944c703185f268a7a624fdd65482Vadim Girlin
1494abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.y = max(src.x, 0.0) */
14954a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1496abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
14974a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1498abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
1499abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[1].chan = 0;
1500abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
1501abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
15024a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1503abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1504abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1505abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
1506abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	/* dst.w, <- 1.0  */
15074a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1508abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1509abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].sel  = V_SQ_ALU_SRC_1;
1510abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.src[0].chan = 0;
1511abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1512abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
1513abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	alu.last = 1;
15144a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1515abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer	if (r)
1516abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer		return r;
1517abe74a9820bc5b512ab24518622368db20187637Pierre-Eric Pelloux-Prayer
15180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
15190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
15200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
152142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
152242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
152342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15244a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
152542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
152642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
15274a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1528df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1529df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1530df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1531df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1532df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1533df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1534df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
153542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
15364a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
15374a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[i]);
153842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
153942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
154042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
154142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
15424a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
154342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
154442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
154542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
154642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
154742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
154842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1549a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
15507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
15517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15524a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1553a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
15547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
15557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
15564a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
15577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1558a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
15597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
156080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
15637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
15644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
15657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
15667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
15677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
15687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
15697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
15707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1571a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1572a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15744a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1575a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1576a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15774a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
15804a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[i], &ctx->src[i], 0);
1581a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1582a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
15854a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1586a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1587a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1588a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1589a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1590a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1591a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic int cayman_pow(struct r600_shader_ctx *ctx)
15937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
15947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i, r;
15964a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
15977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int last_slot = (inst->Dst[0].Register.WriteMask & 0x8) ? 4 : 3;
15987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
15997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < 3; i++) {
16004a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
16024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
16037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.sel = ctx->temp_reg;
16047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.chan = i;
16057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = 1;
16067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == 2)
16077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
16097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
16107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
16117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
16127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* b * LOG2(a) */
16144a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
16164a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
16177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.src[1].sel = ctx->temp_reg;
16187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.sel = ctx->temp_reg;
16197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.dst.write = 1;
16207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	alu.last = 1;
16214a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
16227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	if (r)
16237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return r;
16247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	for (i = 0; i < last_slot; i++) {
16267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		/* POW(a,b) = EXP2(b * LOG2(a))*/
16274a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
16287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
16297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
16307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
16317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
16337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (i == last_slot - 1)
16347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
16354a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
16367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		if (r)
16377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			return r;
16387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
16397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	return 0;
16407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
16417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
1642a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1643a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
16444a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1645a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1646a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1647a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
16484a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1649a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
16504a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
1651a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1652a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1653a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
16544a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1655a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1656a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1657a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
16584a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
165966f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
16604a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[1], 0);
1661a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1662a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1663a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1664a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
16654a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1666a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1667a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1668a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
16694a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1670a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1671a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1672a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1673a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1674a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
16754a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
1676a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1677a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1678a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1679a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1680a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
16810d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
16820d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
16830d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16844a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1685921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
16860d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16870d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
16880d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16894a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1690a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16910d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1692cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
16930d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1694cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
16950d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
1697921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[0], i);
16990d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
17010d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
17024a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17030d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
17040d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
17050d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
17060d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17070d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
17080d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
17094a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1710a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
17110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
171280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
17130d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1715cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
17160d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
17170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1718921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
17190d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
17200d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17210d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1722cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
17230d48925a56ad4fb253386110b545abda82a25464Dave Airlie
17240d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
17250d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
17264a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
17270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
17280d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
17290d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
17300d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
17310d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
17320d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1733cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1734cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
17354a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1736cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1737cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1738cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
17394a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1740cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1741a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
17426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1743cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1744a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
174580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1746cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1747cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1748cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1749cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1750cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1751cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
17524a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1753cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1754cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1755cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1756cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1757cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1758cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17624a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1764dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
17667be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
17677be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
17687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
17697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
17704a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17734a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17757be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
177680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1778cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
17807be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
17834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
17877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1788cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1789cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1792cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17934a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1794cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1795cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
17974a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1798cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1799cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
18004a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[j], &ctx->src[j], i);
1801cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1802a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
180380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1804cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1805a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1806cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1807cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1808cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1809cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1810921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1811cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1812cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1813cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1814cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1815cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1816921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1817cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1818cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1819cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1820e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1821e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1822e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1823e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1824e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1825e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1826e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1827cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1828cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1830de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1832de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
18334a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
18377be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
18406415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline boolean tgsi_tex_src_requires_loading(struct r600_shader_ctx *ctx,
18416415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy						    unsigned index)
18426415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
18436415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18446415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return 	(inst->Src[index].Register.File != TGSI_FILE_TEMPORARY &&
18456415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		inst->Src[index].Register.File != TGSI_FILE_INPUT) ||
18466415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy		ctx->src[index].neg || ctx->src[index].abs;
18476415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
18486415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
18496415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiystatic inline unsigned tgsi_tex_get_src_gpr(struct r600_shader_ctx *ctx,
18506415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy					unsigned index)
18516415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy{
18526415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18536415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	return ctx->file_offset[inst->Src[index].Register.File] + inst->Src[index].Register.Index;
18546415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy}
18556415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
185633241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
185733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
185896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
185933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
18604a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_tex tex;
18614a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
1862641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
186340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy	int r, i, j;
1864bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1865da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	/* Texture fetch instructions can only use gprs as source.
1866da5b4764b28a1efd2e9dbf0741247288da36f546Fabian Bieler	 * Also they cannot negate the source or take the absolute value */
18676415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	const boolean src_requires_loading = tgsi_tex_src_requires_loading(ctx, 0);
186878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	boolean src_loaded = FALSE;
186913c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	unsigned sampler_src_reg = 1;
1870641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
18716415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	src_gpr = tgsi_tex_get_src_gpr(ctx, 0);
1872641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
187313c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
187413c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		/* TGSI moves the sampler to src reg 3 for TXD */
187513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		sampler_src_reg = 3;
187613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
187740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy		for (i = 1; i < 3; i++) {
187840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			/* set gradients h/v */
18794a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
188040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.inst = (i == 1) ? SQ_TEX_INST_SET_GRADIENTS_H :
188140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				SQ_TEX_INST_SET_GRADIENTS_V;
188240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
188340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
188440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
188540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (tgsi_tex_src_requires_loading(ctx, i)) {
188640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = r600_get_temp(ctx);
188740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = 0;
188840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = 1;
188940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = 2;
189040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = 3;
189140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy
189240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				for (j = 0; j < 4; j++) {
18934a47662beaa2092447939db7880531fb706afeddMarek Olšák					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
189440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy					alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
18954a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
189640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.sel = tex.src_gpr;
189740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.chan = j;
189840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (j == 3)
189940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                alu.last = 1;
190040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        alu.dst.write = 1;
19014a47662beaa2092447939db7880531fb706afeddMarek Olšák                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
190240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                        if (r)
190340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy                                                return r;
190440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				}
190513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie
190640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			} else {
190740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
190840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_x = ctx->src[i].swizzle[0];
190940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_y = ctx->src[i].swizzle[1];
191040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_z = ctx->src[i].swizzle[2];
191140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_sel_w = ctx->src[i].swizzle[3];
191240aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.src_rel = ctx->src[i].rel;
191340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
191440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
191540aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
191640aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
191740aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_x = 1;
191840aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_y = 1;
191940aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_z = 1;
192040aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				tex.coord_type_w = 1;
192140aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			}
19224a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_tex(ctx->bc, &tex);
192340aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy			if (r)
192440aec11b7569fcdd2d884629b172af3db3fbaf1dMike Kaplinskiy				return r;
192513c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie		}
192613c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	} else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
19277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		int out_chan;
1928b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
192989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
19307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 2;
19317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
19324a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
19344a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
19367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
19377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
19387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
19397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
19407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (out_chan == i)
19417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
19424a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
19437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
19447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
19457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
19467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
19487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			out_chan = 3;
19494a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
19507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
19514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 3);
19527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
19537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
19547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = out_chan;
19557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
19567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
19574a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
19587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
19597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
19607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
19619d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1962b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
19634a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1964a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1965b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
19667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = out_chan;
19674a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
1968b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1969b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1970b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
19714a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
1972b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1973b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1974b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
19754a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1976a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1977921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1978b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1979b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1980b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1981b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1982b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
19834a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
1984b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1985b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
198678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
1987b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1989bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1990bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
19910e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src0_swizzle[] = {2, 2, 0, 1};
19920e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		static const unsigned src1_swizzle[] = {1, 0, 2, 2};
1993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
19964a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
1997a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
19984a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
19994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[0], src1_swizzle[i]);
2000bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
2001bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
2002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
2003bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
2004bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
20054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2006bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
2007bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
2008bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
2009bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2010bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
201189dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
20127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
20134a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
20167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 2;
20177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].abs = 1;
20187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
20197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
20207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
20227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
20237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
20244a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
20257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
20267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
20277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
20287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
20294a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
20307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
20317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
20327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 2;
20337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].abs = 1;
20347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
20357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
20367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
20377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
20384a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
20397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
20407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
20417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
20427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2043bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
2044bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
20457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
2046bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
20474a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2048a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2049bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2050bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2051bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2052bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
2053bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2054bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
20557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2056bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2057bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2058a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2059bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2060bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2061bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
2062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2063bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
20644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2065bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2066bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2067bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
20684a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2069a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2070bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
2071bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2072bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
2073bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
2074bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
2075bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
20767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2077bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
2078bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
2079a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
2080bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2081bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
2082bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
2083bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
2084bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2085bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
20864a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2087bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
2088bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
2089bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
209078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2091bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
2092bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2093bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
209478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_requires_loading && !src_loaded) {
2095b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
20964a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2097a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
20984a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
2099b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2100b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2101b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
2102b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
2103b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
21044a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2105b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2106b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2107b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
210878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		src_loaded = TRUE;
2109b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2110b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
21117ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2112bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2113de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D) {
2114de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		switch (opcode) {
2115de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE:
2116de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C;
2117de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2118de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_L:
2119de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_L;
2120de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2121de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		case SQ_TEX_INST_SAMPLE_G:
2122de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			opcode = SQ_TEX_INST_SAMPLE_C_G;
2123de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy			break;
2124de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy		}
2125de91ea1c06d3208edfb132fa8bea76bbd883f05cMike Kaplinskiy	}
212633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
21274a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&tex, 0, sizeof(struct r600_bytecode_tex));
2128bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
21296415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy
21306415f256637306fcbaa94fbdaf1bd7692070dce1Mike Kaplinskiy	tex.sampler_id = tgsi_tex_get_src_gpr(ctx, sampler_src_reg);
2131077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
2132641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
21336c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
21349d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
21359d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
21369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
21379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
213878037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	if (src_loaded) {
213978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = 0;
214078037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = 1;
214178037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = 2;
214278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = 3;
214378037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	} else {
214478037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_x = ctx->src[0].swizzle[0];
214578037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_y = ctx->src[0].swizzle[1];
214678037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = ctx->src[0].swizzle[2];
214778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = ctx->src[0].swizzle[3];
2148244a3bbf14ef4f739e7f3be298c8613a2667fce0Fabian Bieler		tex.src_rel = ctx->src[0].rel;
214978037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler	}
21509a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2151bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2152bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2153bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2154bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2155bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2156bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2157bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
215801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
215901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
216001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
21617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
216201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
216301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
2164bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
216569d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) {
216669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
216778037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_z = tex.src_sel_y;
216869d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie	} else if (inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY)
216969d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie		tex.coord_type_z = 0;
217069d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie
2171bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
217278037d95da06b81799e75410154c8141b0a30ec0Fabian Bieler		tex.src_sel_w = tex.src_sel_z;
2173bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
21744a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_tex(ctx->bc, &tex);
2175bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2176bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2177bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2178bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2179bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
218033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
218133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2182b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2183b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2186dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
2187b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2189b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2190c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
21911fa95c7f9e7f1b63364b1f9c6289690418cf6313Henri Verbeet	if (ctx->src[0].sel == V_SQ_ALU_SRC_0_5) {
2192c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
2193c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2194c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
2195c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
21964a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2197c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
21984a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[1], i);
21994a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2200c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
220180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2202c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
2203c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
2204c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
2205c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
22064a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
2207c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
2208c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
2209c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
2210c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
2211c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
2212c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
2213b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2214dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2215dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2216dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2217dffad730df17983cfaef0808555a8c26cad0aa15Christian König
22184a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2219a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2220921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2221b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
22224a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[0], i);
22234a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_toggle_neg(&alu.src[1]);
2224b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2225b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2226dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2227b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2228b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2229b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
22304a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2231b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2232b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2233b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2234b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2235b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2236dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2237dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2238dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2239dffad730df17983cfaef0808555a8c26cad0aa15Christian König
22404a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2241a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2242b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2243b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
22444a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
2245b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2246b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2247dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2248b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2249b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2250b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
22514a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2252b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2253b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2254b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2255b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2256b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2257dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2258dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2259dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2260dffad730df17983cfaef0808555a8c26cad0aa15Christian König
22614a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2262a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2263b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
22644a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
22654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
2266b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2267b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2268dffad730df17983cfaef0808555a8c26cad0aa15Christian König
226980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2270b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2271dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2272b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2273b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
22744a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2275b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2276b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2277b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2278dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2279b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2280b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
228187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
228287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
228387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22844a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
228587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2286dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
228787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
22887be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
22897be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
22907be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
229187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
22924a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2293a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
22944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
22954a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[1], &ctx->src[2], i);
22964a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[2], &ctx->src[1], i);
229780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
229887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
229987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
230087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
23017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
230287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
23034a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
230487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
230587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
23067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
230787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
230887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
230987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
23100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
23110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
23120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23130e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src0_swizzle[] = {2, 0, 1};
23140e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet	static const unsigned int src1_swizzle[] = {1, 2, 0};
23154a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
23160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
23170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
23180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
23200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
23210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
23234a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2324a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
23250e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
23264a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]);
23274a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]);
23280e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
23290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
23300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
23310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
23320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
23330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
23340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
23360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
23370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
23380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
23400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
23414a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
23430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
23440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
23450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
23474a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2348a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
23490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23500e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		if (i < 3) {
23514a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]);
23524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]);
23530e4750a84dfad00c4fe1706aa42d2ede6e731295Henri Verbeet		} else {
23540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
23550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
23560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
23570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
23580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
23590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
23610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
23620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
23630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
23650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
236680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
236780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
23690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
23700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
23710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
23720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
23734a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
23740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
23750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
23760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
23770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
23780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
23790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
23800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
23810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
238236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
238436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
23854a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
238609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
23877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
238836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
238936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
239036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
23914a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2393a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
23944a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
239536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
239636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
239736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
239836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
239936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
24004a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
240136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
240236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
240336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
240489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
24057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
24087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 0;
240936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
24107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
24137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
24157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24164a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
24177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
24207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
24237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 0;
24247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
24277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24294a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
24307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
243336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
24347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
243536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
243636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
24374a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
243836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2439a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
24404a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
244136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
244236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
2443b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#if 0
2444b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2445b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet		if (r)
2446b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet			return r;
2447b2a98c3531c276b76024bb9b10fdd6c3360cb0c9Henri Verbeet#endif
244836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
244936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
245036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
245136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
245236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
24534a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
245436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
245536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
245636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
245736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
245836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
245936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
246089dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
24617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
24624a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24644a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
246536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
24667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
24677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
24687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2) {
24697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
24707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
24717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				}
247236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
24734a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
24747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
24757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
24767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
24777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
24784a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
24797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
24804a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
248136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
24827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
24837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
24847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
24857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
24877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
24884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
24897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
24907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
24917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
249236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
249336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
249436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
249536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
24964a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
249736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2498a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
249936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
250036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
250136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
250236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
250336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
250436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
250536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
25064a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
250736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
250836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
250936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
251036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
251136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
251287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2514460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
25164a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2517460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
25187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	int i;
2519460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2520f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.x = floor(log2(|src|)); */
2521460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
252289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
25237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25244a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2525460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25274a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
25284a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
25297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 0)
25337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
25364a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
25377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
2540460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25424a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25454a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
25464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
25477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
25497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 0;
25507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
25517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
25524a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
25537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
25547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
25557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2556460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2557460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2558460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2559460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2560460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2561460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2562460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2563460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2564460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2565460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
25664a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2567460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2568460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2569460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2570460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2571f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.y = |src.x| / (2 ^ floor(log2(|src.x|))); */
2572460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2573460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
257489dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
25757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
25764a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
257796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
25794a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
25804a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
258196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
25827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
25837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
25847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
25857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
25867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
25877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
25887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
25894a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
25907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
25917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
25927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
25937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
25944a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
25957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
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 = 1;
26027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
26047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26054a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
26067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
260996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26104a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
261196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
261296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
261396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
261496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
261596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
261696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
261796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
261896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
261996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
262096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26214a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
262296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
262396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
262496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
262589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
26267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26274a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
26297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
26307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
26317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
26357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
263896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26394a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
26407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
26437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26444a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
26467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
26477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
264896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
26517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
265396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26544a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
26557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
265896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
265989dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
26607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
26614a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
26637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].sel = ctx->temp_reg;
26647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.src[0].chan = 1;
26657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
26677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
26687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 1)
26697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
26707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
26717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
26727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
26734a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
26747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
26757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
26767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
26777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
26784a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
26797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
26807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].sel = ctx->temp_reg;
26817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.src[0].chan = 1;
268296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
26847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 1;
26857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
26867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
268796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26884a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
26897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
26907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
26917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
269296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26934a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
269496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
269596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
269696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
26974a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
26984a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src_set_abs(&alu.src[0]);
269996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
270096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
270196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2702460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2703460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2704460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2705460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2706460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2707460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27084a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2709460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2710460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2711460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2712460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2713f87d566f4b0e4df18ab60d64951013629bdd624cVadim Girlin	/* result.z = log2(|src|);*/
2714460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
271589dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet		if (ctx->bc->chip_class == CAYMAN) {
27167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			for (i = 0; i < 3; i++) {
27174a47662beaa2092447939db7880531fb706afeddMarek Olšák				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2718460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27204a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27214a47662beaa2092447939db7880531fb706afeddMarek Olšák				r600_bytecode_src_set_abs(&alu.src[0]);
2722460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.sel = ctx->temp_reg;
27247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.dst.write = 1;
27267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				alu.dst.chan = i;
27277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (i == 2)
27287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					alu.last = 1;
2729460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27304a47662beaa2092447939db7880531fb706afeddMarek Olšák				r = r600_bytecode_add_alu(ctx->bc, &alu);
27317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				if (r)
27327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie					return r;
27337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			}
27347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		} else {
27354a47662beaa2092447939db7880531fb706afeddMarek Olšák			memset(&alu, 0, sizeof(struct r600_bytecode_alu));
27367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
27384a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
27394a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src_set_abs(&alu.src[0]);
27407779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.sel = ctx->temp_reg;
27427779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.write = 1;
27437779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.dst.chan = 2;
27447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			alu.last = 1;
27457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
27464a47662beaa2092447939db7880531fb706afeddMarek Olšák			r = r600_bytecode_add_alu(ctx->bc, &alu);
27477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie			if (r)
27487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie				return r;
27497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		}
2750460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2751460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2752460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2753460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
27544a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2755460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2756460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2757460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2758460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2759460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2760460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2761460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2762460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2763460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2764460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
27654a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
2766460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2767460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2768460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2769460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2770460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2771460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2772460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
277398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
277498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
277598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
27764a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
277798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
2778a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
27794a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
278098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
278152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
278252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
278352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
278452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
278552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
278652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
278752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
278852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
278952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
279052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
279152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
279252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
27934a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
279498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2795077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.dst.sel = ctx->ar_reg;
279698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
27974a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
279898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
279998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
2800077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2801077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	/* TODO: Note that the MOVA can be avoided if we never use AR for
2802077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * indexing non-CB registers in the current ALU clause. Similarly, we
2803077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * need to load AR from ar_reg again if we started a new clause
2804077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * between ARL and AR usage. The easy way to do that is to remove
2805077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * the MOVA here, and load it for the first AR access after ar_reg
2806077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	 * has been modified in each clause. */
28074a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
280898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2809077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
281098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
281198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
28124a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
281398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
281498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
281598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
281698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
281798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
281847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
281947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
282047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
28214a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
282247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
2823a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
28247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
28257ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
2826077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2827077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR;
28284a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2829077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2830077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2831077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2832077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
28334a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2834077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
2835077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
2836077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2837077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
2838077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.src[0].sel = ctx->ar_reg;
2839077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2840077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2841077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2842077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
28434a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2844077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
28457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
28467ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
2847077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		memset(&alu, 0, sizeof(alu));
2848077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
28494a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2850077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.sel = ctx->ar_reg;
2851077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.dst.write = 1;
2852077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet		alu.last = 1;
2853077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet
28544a47662beaa2092447939db7880531fb706afeddMarek Olšák		if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
2855077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet			return r;
28567ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
28577ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
28587ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
28597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
28607ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
28617ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2862077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	memset(&alu, 0, sizeof(alu));
2863077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
2864077c448d184799e0d9ec962013ec784c6a5c1807Henri Verbeet	alu.src[0].sel = ctx->ar_reg;
286547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
286647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
28674a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu(ctx->bc, &alu);
286847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
286947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2870c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
287147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
287247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
287347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
287457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
287557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
287657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
28774a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
287857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
287957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
288057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
28814a47662beaa2092447939db7880531fb706afeddMarek Olšák		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
288257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2883a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
288480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
28857ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
28867ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
288757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
288857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
28894a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[0], &ctx->src[0], i);
289057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
289157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2892a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
289357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
289457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
28954a47662beaa2092447939db7880531fb706afeddMarek Olšák			r600_bytecode_src(&alu.src[1], &ctx->src[1], i);
289657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
289757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
289857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
28994a47662beaa2092447939db7880531fb706afeddMarek Olšák		r = r600_bytecode_add_alu(ctx->bc, &alu);
290057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
290157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
290257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
290357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
290457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
290557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2906a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2907a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
29084a47662beaa2092447939db7880531fb706afeddMarek Olšák	struct r600_bytecode_alu alu;
2909a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2910a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
29114a47662beaa2092447939db7880531fb706afeddMarek Olšák	memset(&alu, 0, sizeof(struct r600_bytecode_alu));
2912a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2913a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2914a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2915a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2916a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2917a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2918a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
29194a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_src(&alu.src[0], &ctx->src[0], 0);
2920a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2921a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
29227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2923a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2924a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
29254a47662beaa2092447939db7880531fb706afeddMarek Olšák	r = r600_bytecode_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2926a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2927a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2928a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2929a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2930a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2931a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2932a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
29332bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	unsigned force_pop = ctx->bc->force_add_cf;
29342bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
29352bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (!force_pop) {
29362bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		int alu_pop = 3;
29372bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (ctx->bc->cf_last) {
29382bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
29392bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 0;
29402bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
29412bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin				alu_pop = 1;
29422bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
29432bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		alu_pop += pops;
29442bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		if (alu_pop == 1) {
29452bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
29462bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
29472bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else if (alu_pop == 2) {
29482bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
29492bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			ctx->bc->force_add_cf = 1;
29502bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		} else {
29512bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin			force_pop = 1;
29522bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin		}
29532bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	}
29542bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
29552bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin	if (force_pop) {
29564a47662beaa2092447939db7880531fb706afeddMarek Olšák		r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
29578813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
29588813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
29598813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
29602bde0cc95d8db10b6d2c6689ca39c196a81248b0Vadim Girlin
2961a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2962a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2963a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
296409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2965a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
296609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
296709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
296809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
297109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
297209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
297309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
297409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
297509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
297609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
297709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
297809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
297909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2980a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
298109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
298209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
298309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
298409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
298509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
298609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
298709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
298809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
298909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
299009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
299109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2992a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2993a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2994a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
299509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
299609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
299709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
299809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
299909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
300009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
300109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
30027ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
300309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
300409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
300509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
300609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
300709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
300809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
300909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
301009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
301109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
301209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
301309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
301409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
301509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
301709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
301809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
301909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
302009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
302109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
302209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
302309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
302409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
302509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
302609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
30274a47662beaa2092447939db7880531fb706afeddMarek Olšák	sp->mid = (struct r600_bytecode_cf **)realloc((void *)sp->mid,
30284a47662beaa2092447939db7880531fb706afeddMarek Olšák						sizeof(struct r600_bytecode_cf *) * (sp->num_mid + 1));
302909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
303009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
303109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3032a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
303309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
303409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3035a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
303609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
303709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
303809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
303909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
304009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
304109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
304209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
304309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
304409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
304509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
304609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
304709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
304809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
304909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
305009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
305109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
305209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
305309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
305409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
305509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
30564a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
305709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
305809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
305909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
306009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
306109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
306209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
30634a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
306409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
306509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
306609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
306709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
3068a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
306909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
307009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
307109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
307209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
307309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
307409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
307509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
30767ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
307709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
307809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
307909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
308009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
308109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
308209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
308309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
308409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
308509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
308609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
308709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
308809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
308909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
309009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
309109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
30924a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
309309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
309409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
309509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
309609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
309709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
309809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
309909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
310009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
310109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
310209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
3103a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
310409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
31054a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
310609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
310709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
310809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
310909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
3110a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3111a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3112a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3113a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
3114a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
31154a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
3116a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
3117a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
311809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
3119a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
3120a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3121a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3122a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3123a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
3124a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
3125a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
3126a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
3127a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
3128a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
3129a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
3130a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3131a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
3132a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
3133a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
3134a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
313509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
3136a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
313709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
313809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
313909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
314009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
314109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
314309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
314409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
31454a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
314609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
314709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
3148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
314909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
315009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
315109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
315209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
315309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
315409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
315509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
315609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
315709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
31584a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
315909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
316009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
316109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
316209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
316309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
316409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
316509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
316609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
316709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
316909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
317009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
317209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
317309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
317409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
317509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
317609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
317709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
317809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
317909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
318009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
318109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
318209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
318309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
318409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
318509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
318609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
318709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
318809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
318909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
319009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
319109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
319209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
319309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
319409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
319509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
319609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
319709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
31984a47662beaa2092447939db7880531fb706afeddMarek Olšák	r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
319909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
320009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
320109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
320209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
320309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
320409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3205a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3206a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3207a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
320998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
32110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3212df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3213df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3214df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3215df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3216df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3217df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3218df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
321942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
322036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3221460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3224cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3225cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
322657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3227dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3229d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3230be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3233b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32413af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32433af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3244df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
32457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
32464558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3247a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
32480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32517a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3253e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
325488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
32553af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
32563af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
32574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32630d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32650d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
326688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3267d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
32680d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3270b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
327113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
3272b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32799f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
32830d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
328487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
328592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3286d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3289cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3290ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
329109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3292a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3296a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3297a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
33060ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
3307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3339094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3369cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3370cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3371cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3372cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3373cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3374cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3375cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3376cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3377cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3378cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3379cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3380cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
3381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
338350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
338450526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
338598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
338650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
338750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
338850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
33898ab1c5328b12e8b075f62599a84672024aaf2982Vadim Girlin	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_rsq},
339050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3391112ffdfd0734040a72b690a4ac4101f3211bb238Rafael Monica	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
339250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
339350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
339450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
339550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
339650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
339750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
339850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
339950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
340050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
340150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
340250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
340350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
340450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
340550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
340650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
340750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
340850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
340950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
341250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
341350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3414df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
341550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
341650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
341750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
341850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
341950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
342050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
342150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
342250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
342350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
342450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
342550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
342650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
342750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
342850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
342950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
343450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
343550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
343650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
343750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
343850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
343950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
344050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
344113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
344250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
344350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34447779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34457779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34467779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34477779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34497779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
34507779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
34547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
34557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
34567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
34577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
34607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
34617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
34627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
34637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
34677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
34687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
34777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
34887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
34917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
34937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
34957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
34997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
35017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
35107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
35117779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
35127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35147779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35207779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35217779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35227779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35237779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35257779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35267779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35277779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35287779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35297779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35307779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35317779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35327779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35337779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35347779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35357779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35367779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35377779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35387779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3539cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3540cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3541cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3542cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3543cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3544cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3545cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3546cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3547cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3548cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3549cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3550cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
35517779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35527779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie};
35537779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
35547779f6d1dffde2c0501e44adc342e52803de08d4Dave Airliestatic struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = {
35557779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
35567779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
35577779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
35587779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, cayman_emit_float_instr},
35597779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, cayman_emit_float_instr},
35607779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
35617779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
35627779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
35637779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
35647779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
35657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
35667779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
35677779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
35687779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
35697779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
35707779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
35717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
35727779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
35737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
35747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
35767779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35777779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35787779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
35797779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35807779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35817779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
35827779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3584df7859be6b6b6c227e7a4e0b7fbfafcd0800f4f8Lauri Kasanen	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RNDNE, tgsi_op2},
35857779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, cayman_emit_float_instr},
35867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, cayman_emit_float_instr},
35877779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, cayman_pow},
35887779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
35897779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	/* gap */
35907779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35917779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
35927779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35937779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
35947779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, cayman_trig},
35957779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
35967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
35977779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
35987779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
35997779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36007779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36017779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36027779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36037779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
36047779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36057779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
36067779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, cayman_trig},
36077779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
36087779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
36097779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36107779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
361113c9a8552bc83b1ad91442caacf847cb6cead2b5Dave Airlie	{TGSI_OPCODE_TXD,	0, SQ_TEX_INST_SAMPLE_G, tgsi_tex},
36127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
36137779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
361952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
362050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
362150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
362250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
362350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
362450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
362550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
362650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
362750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
362850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
362950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3630ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
363150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
363250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
363350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
363450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
363650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
363750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
363850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
363950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
36460ab7dcddb35560626c1aab4e8e6181dc4b4703a6Fabian Bieler	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_op2},
364750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
364850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
364950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
365850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
365950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
366050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
366150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
366250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
366350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
366450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
366550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
366650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
366750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
366850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
366950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
367150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
367950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
368050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
368150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
368250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
368350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
368450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
368550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
368650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
368750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
368850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
368950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
369950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
370850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3709cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD,      0, 0, tgsi_unsupported},
3710cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_LOAD_MS,   0, 0, tgsi_unsupported},
3711cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE,    0, 0, tgsi_unsupported},
3712cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_B,  0, 0, tgsi_unsupported},
3713cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C,  0, 0, tgsi_unsupported},
3714cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
3715cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_D,  0, 0, tgsi_unsupported},
3716cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_L,  0, 0, tgsi_unsupported},
3717cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_GATHER4,   0, 0, tgsi_unsupported},
3718cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_RESINFO,	0, 0, tgsi_unsupported},
3719cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
3720cc9a8915f093c57d2748370d18ed47f66c933013Dave Airlie	{TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
372150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
372250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3723