r600_shader.c revision dffad730df17983cfaef0808555a8c26cad0aa15
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"
24de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h"
25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h"
2633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h"
27de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h"
289c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h"
29de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h"
30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
31a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h"
3272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
33de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
361235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader)
371235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
381235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_state *rstate = &shader->rstate;
391235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	unsigned spi_vs_out_id[10];
411235becaa1cf7e29f580900592563c3329d326deJerome Glisse	unsigned i, tmp;
422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* clear previous register */
441235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rstate->nregs = 0;
451235becaa1cf7e29f580900592563c3329d326deJerome Glisse
461235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* so far never got proper semantic id from tgsi */
47afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	/* FIXME better to move this in config things so they get emited
48afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	 * only one time per cs
49afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	 */
501235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < 10; i++) {
511235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_vs_out_id[i] = 0;
521235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
531235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < 32; i++) {
541235becaa1cf7e29f580900592563c3329d326deJerome Glisse		tmp = i << ((i & 3) * 8);
551235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_vs_out_id[i / 4] |= tmp;
561235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
571235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < 10; i++) {
581235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate,
591235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R_028614_SPI_VS_OUT_ID_0 + i * 4,
601235becaa1cf7e29f580900592563c3329d326deJerome Glisse					spi_vs_out_id[i], 0xFFFFFFFF, NULL);
611235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
621235becaa1cf7e29f580900592563c3329d326deJerome Glisse
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
641235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_0286C4_SPI_VS_OUT_CONFIG,
651235becaa1cf7e29f580900592563c3329d326deJerome Glisse			S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2),
661235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0xFFFFFFFF, NULL);
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_028868_SQ_PGM_RESOURCES_VS,
691235becaa1cf7e29f580900592563c3329d326deJerome Glisse			S_028868_NUM_GPRS(rshader->bc.ngpr) |
701235becaa1cf7e29f580900592563c3329d326deJerome Glisse			S_028868_STACK_SIZE(rshader->bc.nstack),
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0xFFFFFFFF, NULL);
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
73fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse			R_0288D0_SQ_PGM_CF_OFFSET_VS,
741235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0x00000000, 0xFFFFFFFF, NULL);
751235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
76fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse			R_028858_SQ_PGM_START_VS,
77fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse			r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
78fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse
79738aa29289296512959cbb37d8602131dae44dabDave Airlie	r600_pipe_state_add_reg(rstate,
80738aa29289296512959cbb37d8602131dae44dabDave Airlie				R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF,
81738aa29289296512959cbb37d8602131dae44dabDave Airlie				0xFFFFFFFF, NULL);
82738aa29289296512959cbb37d8602131dae44dabDave Airlie
831235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
841235becaa1cf7e29f580900592563c3329d326deJerome Glisse
85dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs,
861235becaa1cf7e29f580900592563c3329d326deJerome Glisse				struct r600_shader *ps, int id)
871235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
881235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader_io *input = &ps->input[id];
891235becaa1cf7e29f580900592563c3329d326deJerome Glisse
901235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (int i = 0; i < vs->noutput; i++) {
911235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (input->name == vs->output[i].name &&
921235becaa1cf7e29f580900592563c3329d326deJerome Glisse			input->sid == vs->output[i].sid) {
931235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return i - 1;
941235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
951235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
961235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
971235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse
991235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_state *rstate = &shader->rstate;
1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
10369251fc4cd5f71be403e08398bc43d19052a640dJerome Glisse	unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1;
1041e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	int pos_index = -1, face_index = -1;
1051235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rstate->nregs = 0;
1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->ninput; i++) {
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
1101e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie			pos_index = i;
1111235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
1121e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie			face_index = i;
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
114afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse
1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->noutput; i++) {
11651f9cc4759c23b74a2e4d9c79b0a5df27d403f54Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
1177777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie			r600_pipe_state_add_reg(rstate,
1187777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						R_02880C_DB_SHADER_CONTROL,
1197777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						S_02880C_Z_EXPORT_ENABLE(1),
1207777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						S_02880C_Z_EXPORT_ENABLE(1), NULL);
12139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
12239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			r600_pipe_state_add_reg(rstate,
12339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						R_02880C_DB_SHADER_CONTROL,
12439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						S_02880C_STENCIL_REF_EXPORT_ENABLE(1),
12539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						S_02880C_STENCIL_REF_EXPORT_ENABLE(1), NULL);
1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse	exports_ps = 0;
1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse	num_cout = 0;
1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->noutput; i++) {
13139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse			exports_ps |= 1;
1331235becaa1cf7e29f580900592563c3329d326deJerome Glisse		else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) {
1341235becaa1cf7e29f580900592563c3329d326deJerome Glisse			num_cout++;
1351235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1361235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1371235becaa1cf7e29f580900592563c3329d326deJerome Glisse	exports_ps |= S_028854_EXPORT_COLORS(num_cout);
1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (!exports_ps) {
1391235becaa1cf7e29f580900592563c3329d326deJerome Glisse		/* always at least export 1 component per pixel */
1401235becaa1cf7e29f580900592563c3329d326deJerome Glisse		exports_ps = 2;
1411235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1421235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1431235becaa1cf7e29f580900592563c3329d326deJerome Glisse	spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) |
1441235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_0286CC_PERSP_GRADIENT_ENA(1);
1451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	spi_input_z = 0;
1461e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	if (pos_index != -1) {
1471e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie		spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) |
1481e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie					S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) |
1491e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie					S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) |
1501e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie					S_0286CC_BARYC_SAMPLE_CNTL(1));
1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_input_z |= 1;
1521235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1531e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie
1541e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	spi_ps_in_control_1 = 0;
1551e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	if (face_index != -1) {
1561e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie		spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) |
1570637044add50b3a4aee8e915b84c18813c9130f3Dave Airlie			S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr);
1581e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	}
1591e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie
1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, 0xFFFFFFFF, NULL);
1611e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1, 0xFFFFFFFF, NULL);
1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL);
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028840_SQ_PGM_START_PS,
165d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse				r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028850_SQ_PGM_RESOURCES_PS,
1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_028868_NUM_GPRS(rshader->bc.ngpr) |
1691235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_028868_STACK_SIZE(rshader->bc.nstack),
1701235becaa1cf7e29f580900592563c3329d326deJerome Glisse				0xFFFFFFFF, NULL);
1711235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1721235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028854_SQ_PGM_EXPORTS_PS,
1731235becaa1cf7e29f580900592563c3329d326deJerome Glisse				exports_ps, 0xFFFFFFFF, NULL);
1741235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1751235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_0288CC_SQ_PGM_CF_OFFSET_PS,
1761235becaa1cf7e29f580900592563c3329d326deJerome Glisse				0x00000000, 0xFFFFFFFF, NULL);
1771235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1781235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (rshader->uses_kill) {
1791235becaa1cf7e29f580900592563c3329d326deJerome Glisse		/* only set some bits here, the other bits are set in the dsa state */
1801235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate,
1811235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R_02880C_DB_SHADER_CONTROL,
1821235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1),
1831235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1), NULL);
1841235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
185738aa29289296512959cbb37d8602131dae44dabDave Airlie	r600_pipe_state_add_reg(rstate,
186738aa29289296512959cbb37d8602131dae44dabDave Airlie				R_03E200_SQ_LOOP_CONST_0, 0x01000FFF,
187738aa29289296512959cbb37d8602131dae44dabDave Airlie				0xFFFFFFFF, NULL);
1881235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse
19069251fc4cd5f71be403e08398bc43d19052a640dJerome Glisseint r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
1921235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
1931235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
1941235becaa1cf7e29f580900592563c3329d326deJerome Glisse	void *ptr;
1951235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1961235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
1971235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
19829c4a15bf61a76cd71ffa5b8f09706d0eab84281Keith Whitwell		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0);
1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
2001235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
202294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse		memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4);
204294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
2051235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
2081235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
2091235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2101235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
2111235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2121235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
2131235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2141235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2211235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2251235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2271235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2281235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
229dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
231052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse
235052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König        /* Would like some magic "get_bool_option_once" routine.
236052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König         */
237052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König        if (dump_shaders == -1)
238052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König                dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
239052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
240052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
241052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
242052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		tgsi_dump(tokens, 0);
243052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse	shader->shader.family = r600_get_family(rctx->radeon);
2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_shader_from_tgsi(tokens, &shader->shader);
2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_bc_build(&shader->shader.bc);
2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
2531235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
255052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
256052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		r600_bc_dump(&shader->shader.bc);
257052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
258052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
259afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse
26269251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
263ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
264ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
265ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
266ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	r600_bo_reference(rctx->radeon, &shader->bo, NULL);
267f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck	r600_bc_clear(&shader->shader.bc);
268ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
269ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
2732b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
2742b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2752b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
2762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
2772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
2782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
2792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
2802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
2812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
2822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
2832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
2842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
2852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
286cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
287cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
288e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
289fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
290fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
291fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
292fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
293fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
2942b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
2952b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
2972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
2982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
2992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
3002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
3012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
30350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[];
30442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
31472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
318c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
319a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
32372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
324a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
3268260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
3278260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
3288260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
33347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
33447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
33972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
34072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
341fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
34250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
34350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
34450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
345fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
346fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
347fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
348fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
349fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
350fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
351fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
352fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
353fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
354fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
355fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
356fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
357fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
358fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
359fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
360fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
3647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
365fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
366fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
367fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
36850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
36950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
37050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
37150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
37250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
37350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
37450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
37550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
37650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
37750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
37950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
38050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
38150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
38250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
384fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
385fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
387fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
38850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
38950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
39050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
39150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
39250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
39350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
39450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
39550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
3977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
3987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
3997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
40172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
40472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
41035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4118a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
4134afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) {
41450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
415fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
416fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
417fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
418fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
419fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
420fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
42150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
42835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
43233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
43347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
44072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
44172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
442be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
443be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
444be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
445be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
446be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
4477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
448fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
449fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
450fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
451fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
452fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
453fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
454fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
455fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
49572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
497de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
498c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
501de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
50272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
513f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
516076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
517076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
518076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
519f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
520f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
521f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
523076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
524076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
525076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
526076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
5414afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx.bc->chiprev == CHIPREV_EVERGREEN) {
542f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
543f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
544f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
545f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5474afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) {
548fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
54984457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
554d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
55597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
55697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
55797e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
558d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
563cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
564cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
565cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
571cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
572cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
573cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
574cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
575cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
576cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
577cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
578cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
579cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
580cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
591be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
592be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
593be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
5954afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher			if (ctx.bc->chiprev == CHIPREV_EVERGREEN)
59650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
59750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
59850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
6022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
606876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
607876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
615457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
616457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
617c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
618c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
619c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
620c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
621c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
622c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
623c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
624c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
625c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
626c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
627a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
628457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
631c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
632c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
634457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
635457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
636457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
637457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
638457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
639457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
640457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
645b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
646c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
6475f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
648c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
649b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
65039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
65139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
65239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
65339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
65439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
65539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
65639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
65739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
658c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
66972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
670457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
671457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
672457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
673457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
674457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
675457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
676457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
677457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
678457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
679457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
680457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
681457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
682457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
683457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
684457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
685457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
686457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
689457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
6907e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
691457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
693c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
694481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
695481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
696481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
697481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
698481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
699481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
700481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
701481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
702481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
703481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
704608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
705481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
706a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
707481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
708481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
709457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
710457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
711457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
712457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
713457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
714b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
715b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
716a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
717c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
718c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
719457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
720457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
721c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
725cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
729cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
749cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	int index;
7507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
754cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
755cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[0] = ctx->literals[index * 4 + 0];
756cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[1] = ctx->literals[index * 4 + 1];
757cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[2] = ctx->literals[index * 4 + 2];
758cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[3] = ctx->literals[index * 4 + 3];
759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
76047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_src->Register.Indirect)
76147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_src->rel = V_SQ_REL_RELATIVE;
7621bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
7638260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell	r600_src->abs = tgsi_src->Register.Absolute;
764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
7737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7747a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
77947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
78047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
7817a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
7827a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
7837a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
7887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
7897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
7917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
7927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
7937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
7947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
7957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
7967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
7977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
7987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
7997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
8007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
8027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
8047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
8077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
8087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
8107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
8117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
8127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
8157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
8199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
820be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
8217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
823a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8249d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
8257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
82640cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid				alu.src[0].rel = r600_src[i].rel;
827be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
8287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
8297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
8307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
8327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
8337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
8347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
8357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
8369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
83740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid			r600_src[i].rel =0;
8387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
8397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
8437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
844be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
845be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
846be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
847be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
848be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
84920846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee	int i, j, k, nliteral, r;
850be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
851be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
852be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
853be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
854be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
855be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
8569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
8579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
858be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
859be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
860be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
861a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8629d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
863be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
864be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
866be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
867be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
869be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
870be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
871be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
872be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
8739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]);
874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			if (r)
875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				return r;
8769d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
8779d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			j--;
878be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
879be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
880be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
881be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
882be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
883dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
885dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
886d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
887d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
888dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
889d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
890d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
891d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
892dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
893dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
894dffad730df17983cfaef0808555a8c26cad0aa15Christian König
895dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
896dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
897dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
898dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct r600_bc_alu_src r600_src[3];
899dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct r600_bc_alu alu;
900dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
901dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9069d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
9079d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
9089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
909d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
910d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
911d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
912d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
914d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
915d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
916d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
9177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
918d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
919d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
924d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
925d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
926d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
927d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
928d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
929d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
9367a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
9377a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
9387a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
942d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
952d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
953d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
954d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
955d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
956d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
957d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
958d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
959d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
960d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
961d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
9627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
96388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
96488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
96588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
96688f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
96792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
96892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie			   struct r600_bc_alu_src r600_src[3])
96988f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
97088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
971242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	int r, src0_chan;
97288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
97392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
9747ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
97588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
97688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
97788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
97888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
9799d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
9809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
9819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
982be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
983242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	src0_chan = tgsi_chan(&inst->Src[0], 0);
984242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck
985242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	/* We are going to feed two literals to the MAD below,
986242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	 * which means that if the first operand is a literal as well,
987242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	 * we need to copy its value manually.
988242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	 */
989242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	if (r600_src[0].sel == V_SQ_ALU_SRC_LITERAL) {
990242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck		unsigned index = inst->Src[0].Register.Index;
991242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck
992242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck		lit_vals[2] = ctx->literals[index * 4 + src0_chan];
993242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck		src0_chan = 2;
994242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	}
995242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck
99688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1000a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
100188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
100288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
100388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
100588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
1008242205404d24f04f9abe1cfa01b9cf0f9e4f9d07Tilman Sauerbeck	alu.src[0].chan = src0_chan;
10097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1010921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1012921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
101388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
101488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
101588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
101888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
101988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1023a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
10247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
102788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
10364afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher	if (ctx->bc->chiprev == CHIPREV_R600) {
103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1045a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
104988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
105088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
105288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
105388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
10547ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1055921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
105688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1057921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
105888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
105988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
106088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
106188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
106288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
106388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
106692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
106792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
106892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
106992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
107292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
107392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
107492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1075dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
107692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
107792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
107892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
107992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
108088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
109288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
109388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1095be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1096be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1097be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1098be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
109988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1100a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1101be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1102be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
110488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
1106be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
110888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
111088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
111188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
111692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
111792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
111892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
111992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
112092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
112192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
112257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
112357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
112557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
112657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_setup_trig(ctx, r600_src);
112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
113092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
113192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
113257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
113357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
113657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
113757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
113892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
113957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
114057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
114157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
114257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
114357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
114457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
114557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
114692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
114792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
114857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
114957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
115057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
115157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
115357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
115457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
115557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
115657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
115757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
115857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
115957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
116057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
116157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
116292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1187ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1190ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1191ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1192ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1193ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1194ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1195ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1196ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1197ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1198ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1199ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1200ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1201ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1202ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1203ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1204ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1205ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1206ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1207ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1208ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1209ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1210ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
121192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
121292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
121392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1214094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1219094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1220094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1221094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1222094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1224094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
12254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1226921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
12274502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
12294502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
12304502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
12314502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
12324502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
12334502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
12344502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
12354502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
12364502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1237094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1238094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1239094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1240094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1241094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1242094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1243094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
12444502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
12454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	if (r)
12464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		return r;
12474502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
12494502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
12504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1251094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1252094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1253094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
12540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
12550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
12560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
1258ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	struct r600_bc_alu_src r600_src[3];
12590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
12600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1261ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
1262ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
1263ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
1264d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1265d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
1266d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
1267ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
12687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1270a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1271921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
12777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
12827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1283a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1284ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	alu.src[0] = r600_src[0];
1285921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
128685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
12877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
12887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
12917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
12967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1297a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1298921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
12997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
13007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
13017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
13047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
13057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13095ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
13105ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
13115ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
13125ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
13140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
13156a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
13166a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
13176a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
13180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
13190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1320a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1321ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
1322ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
13230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
13325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
13335ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
133485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie
13356a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
13366a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
13370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
13390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1340a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1341ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
13427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
13430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
13440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1345ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1346ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[2] = r600_src[0];
13477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
13480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
13490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
13510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
13520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13575ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
13585ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
13595ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
13600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
13610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1362a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
13630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
13640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
13650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
13730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
13740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
13750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
137642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
137742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
137842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
137942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
138042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
138142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
138242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1383df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1384df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1385df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1386df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1387df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1388df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1389df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
139042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
139142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
139242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		if (r)
139342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck			return r;
139442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
139542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
139642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
139742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
139842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
139942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
140042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
140142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
140242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
140342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_literal(ctx->bc, ctx->value);
140442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
140542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
140642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
140742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
140842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
140942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1410a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
14117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
14127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
14157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
14167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
14177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
14187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1419a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
14207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
14217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
14267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
14277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
14287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
14317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
14327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
14337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1448a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1449a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1450a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1451a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1452a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1453a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
14545ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
14555ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
14565ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
1457a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1458a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1459a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1468a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1470a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1471a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1472a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1473a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1474a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1476a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1480e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1481e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1482e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1483a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1484a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
148566f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1486a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1487a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1488a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1489a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1490a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1491a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1492a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1493a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1494a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1495a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1496a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1497e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1498e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1499e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1500a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1501a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1502a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1503a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1504a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1505a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1506a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1507a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1508a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1509a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1510e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1511e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1512e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1513a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1514a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1515a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
15160d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
15170d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
15180d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
15200d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1521921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
15220d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15230d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
15240d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
15250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
15269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
15279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
15289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
15290d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15300d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
15310d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
15320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1533a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
15340d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1535cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
15360d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1537cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
15380d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15390d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
15400d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
15410d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1542921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
15430d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15440d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
15450d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
15460d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
15470d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
15480d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15490d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15500d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
1552cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
1553cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	if (r)
1554cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		return r;
15550d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15560d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
15570d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
15580d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1559a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
15600d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
15610d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15620d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15630d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15640d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15650d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1566cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
15670d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
15680d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1569921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
15700d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
15710d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15720d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1573cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
15740d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15750d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
15760d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
15770d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15780d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15790d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15800d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
15810d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
15820d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
15830d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1584cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1585cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1588cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
15899961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
15909961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
15919961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1592cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1593cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1594cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1595a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
15966c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1597cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1598a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1599cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1600cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1601cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1602cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1603cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1604cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1605cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1606cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1607cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1608cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1609cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1610cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1611cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1612cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1613cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1614cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1621dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
16237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
16247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
16257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
16269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
16279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
16289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
16297be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
16307be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
16317be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
16327be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
16377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
16397be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
16407be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16417be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (r)
16427be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			return r;
16437be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
16477be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1657cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1658cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1659cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1661cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1662cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1663cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
16647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
16657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
16667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
16679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
16689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
16699d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1672cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1673cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
16757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1676cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1677a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
1678a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1679a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		if (r)
1680a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König			return r;
1681a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
1682cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1683a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1684cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1685cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1686cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1687cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1688921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1689cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1690cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1691cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1692cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1693cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1694921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1695cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1697cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1698e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1699e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1700e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1701e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1702e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1703e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1704e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
17157be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
171833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
171933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
172033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
172133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1722641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1723641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1724b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1725bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
172693a95ad8ff1d543f886f123029d1329513729c4bChristian König	boolean src_not_temp =
172793a95ad8ff1d543f886f123029d1329513729c4bChristian König		inst->Src[0].Register.File != TGSI_FILE_TEMPORARY &&
172893a95ad8ff1d543f886f123029d1329513729c4bChristian König		inst->Src[0].Register.File != TGSI_FILE_INPUT;
1729bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	uint32_t lit_vals[4];
1730641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1731641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1732641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1736a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1737bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1738bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1739bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1741b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1742b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1743b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1744b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1745b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1746b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1747b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1748b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
17499d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1750b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1751b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1752a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1753b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1754b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1758b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1759b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1760b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1761b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1762b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1763b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1764b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1765b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1766b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1767a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1768921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1769b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1770b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1771b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1772b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1773b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1774b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1775b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1776b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
177707b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1778b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1787a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1790bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1792bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1801bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1803bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1804bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
180584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee			default:
180684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				assert(0);
180784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src_chan = 0;
180884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src2_chan = 0;
180984b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				break;
1810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1811bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1814bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan);
1815bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1817bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan);
1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1825bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1828bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1829bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1831a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1835bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
18427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
18457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1848a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1849bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
18557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1859bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1860bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1861bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1862bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1863bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1864bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1865bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1866bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1867bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1868a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1869bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1870bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1871bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1872bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1873bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1874bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
18757ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1877bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1878bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1880bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1881bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1882bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1883bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1884bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1885bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1888bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		lit_vals[0] = fui(1.5f);
1889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_literal(ctx->bc, lit_vals);
1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
189307b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
1898b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1899b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1900a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1901b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1902a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
1903b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1904b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1905b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1906b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1907b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1908b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1909b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1910b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1911b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1912b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1913b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
19147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1916bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
191933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
192033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
1922ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
1923ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.resource_id = tex.sampler_id;
1924641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
19256c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
19269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
19279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
19289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
19299d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
193033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
193133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
193233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
193333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
19349a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1936bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1938bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
194201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
194301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
194401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
19457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
194601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
194701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
1948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1949bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
19505d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
1951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1952bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
1953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
1955bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
195833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
195933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1960b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1965dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
19697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
19707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
19717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
19729d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
19739d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
19749d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1976dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
1977dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1978dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
1979dffad730df17983cfaef0808555a8c26cad0aa15Christian König
1980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1981a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1982921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
19847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
19857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1986b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1987b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1988b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1989dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
1990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1991b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1994b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1995b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1998b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
2000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2002dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2003dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2004dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2005dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2006b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2008b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2009b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
20107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
20117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
2012b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2013b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2014dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2015b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2016b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2017b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2018b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2019b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2021b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2022b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
2023b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
2024b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
2025b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2027dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2028dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2029dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2030dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2031b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2032a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2033b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
20347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
20357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
20367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
20377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
2038b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2039b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2040dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2041dffad730df17983cfaef0808555a8c26cad0aa15Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2042dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (r)
2043dffad730df17983cfaef0808555a8c26cad0aa15Christian König			return r;
2044dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2045b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2046dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2047b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2048b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2049b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2050b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2051b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2052b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2053dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2054b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2055b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
205687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
205787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
205887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
205987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
206087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
206187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2062dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
206387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
206487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
206587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
206687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
20679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20689d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20699d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
207087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
20717be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
20727be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
20737be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
207487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
207587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2076a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
207787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
207887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
207987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
208087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
208187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
208287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
208387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
208487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
208587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
20867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (r)
20887be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			return r;
20897be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
209087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
209187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
209287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
20937be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
209487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
209587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
209687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
209787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
20987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
209987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
210087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
210187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
21030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
21110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
21169d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
21179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
21189d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
21199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
21200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2122a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
21230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
21280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
21310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
21340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
21410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
21470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
21500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
21651e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
21661e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
21671e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
21681e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
21820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
21950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
22000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
22090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
22150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
22160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
22170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22261e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
22271e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
22281e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
22291e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
22350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
223736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
223836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
223989c26866f05dcf8fbb716e38d4780cebcae71653Vinson Lee	struct r600_bc_alu_src r600_src[3] = { { 0 } };
224036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
224109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
224236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
224336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
224436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
224536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
224636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2247a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
224836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
224936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
225036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
225136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
225236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
225336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
225436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
225536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
225636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
225736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
225836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
225936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
226036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
226136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
22625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
22635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
22645ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
22655ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
2266a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
226736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
226836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
226936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
227636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
22775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
22785ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
22795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
22805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
22827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
228436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
228536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
228636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2287a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
229736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
229836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
230436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
230536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23085ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
231136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
231236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
231336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2314a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
231536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
231636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
231736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
231836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
231936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
232036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
232136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
232236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
232336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
232436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
232536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
232636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
232736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
232836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
233236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
233336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
233436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
233536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2338a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
233936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
234136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
234236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
234336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
234536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
234736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23495ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23505ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23515ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
235436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
235587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2358460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2362460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2363460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2364460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2365460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2366460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2367460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2368460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2369460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2370460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2371460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2372460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2373460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2374460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2375460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2376460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2377460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2378460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2379460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2380460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2381460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2382460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2383460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2384460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2385460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2386460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2387460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2388460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2389460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2390460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2391460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2392460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2393460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2394460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2395460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2396460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2397460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2398460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2399460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2400460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2401460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2402460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
240396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2404460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2405460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2406460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
240796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
240996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
241096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
241396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
241596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
241696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
241796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
241896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
242096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
242196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
242296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
242496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
242596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
242696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
242896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
243096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
243196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
243296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
243396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
243496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
243596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
243696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
243796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
243896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
243996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
244096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
244196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
244396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
244496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
244596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
244796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
244896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
244996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
245096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
245196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
245296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
245396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
245496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
245596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
245696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
245796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
245896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
245996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
246096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
246196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
246296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
246396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
246496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
246596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
246696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
246796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
246896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
246996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
247096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
247196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
247296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
247396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
247496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
247596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
247696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
247796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
247896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
247996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
248196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
248296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
248396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
248596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
248796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
248896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
248996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
249096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
249196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
249296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
249396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
249496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
249596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2501460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2502460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2503460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2505460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2506460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2507460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2508460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2509460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2510460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2511460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2512460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2513460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2514460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2515460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2516460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2517460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2518460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2519460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2520460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2521460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2522460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2523460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2524460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2525460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2526460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2527460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2528460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2529460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2530460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2531460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2532460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2533460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2534460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2535460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2536460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2537460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2538460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2539460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2540460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2541460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2542460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2543460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2544460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2545460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2546460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2547460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2548460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2549460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2550460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2551460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2552460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2553460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2554460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2555460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2556460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2557460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2558460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2559460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2560460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
256198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
256298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
256398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
256498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct r600_bc_alu alu;
256598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
256698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
256798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
256852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
256952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
257052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
257152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
257252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
257352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
257452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
257552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
257652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
257752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
257852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
257952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
258098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
258198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
258298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
258398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
258498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
258598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.chan = 0;
258698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.sel = ctx->temp_reg;
258798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
258898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
258998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
259098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
259198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
259298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
259398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
259498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
259598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
259698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].sel = ctx->temp_reg;
259798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
259898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
259998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
260098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
260198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
260298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
260398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
260498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
260547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
260647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
260747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
260847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
260947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
261047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
261147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
26127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
26137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
26147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
26157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
26167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
26177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA;
26187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
26197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
26207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
26217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
26227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
26237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
262447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
262547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
262647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
262747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
262847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
262947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
263047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
263147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2632a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
263347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
263447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2635c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
263647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
263747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
263847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
263957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
264057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
264157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
264257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
264357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
264457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
264557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
264657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
264757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2648a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
264957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
265057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
265157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
26527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
26537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
265457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
265557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
265657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
265757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
265857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
265957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
266057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
266157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
266257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 2) {
266357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
266457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
266557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]);
266657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
266757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
266857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
266957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
267057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
267157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
267257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
267357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
267457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
267557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
267657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
267757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
267857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2679a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2680a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2681a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
268209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2683a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2684a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2685a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2686a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2687a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2691a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2692a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2693a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2694a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2695a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2696a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2697a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2698a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
26997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2700a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2701a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2702a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2703a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2704a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2706a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2707a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2708a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2709a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
27108813842121d46d1be476807c98b0ba0b771f0c91Christian König	int alu_pop = 3;
27118813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (ctx->bc->cf_last) {
27128813842121d46d1be476807c98b0ba0b771f0c91Christian König		if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
27138813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 0;
27148813842121d46d1be476807c98b0ba0b771f0c91Christian König		else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
27158813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 1;
27168813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
27178813842121d46d1be476807c98b0ba0b771f0c91Christian König	alu_pop += pops;
27188813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (alu_pop == 1) {
27198813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
27208813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
27218813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else if (alu_pop == 2) {
27228813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
27238813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
27248813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else {
27258813842121d46d1be476807c98b0ba0b771f0c91Christian König		r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
27268813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
27278813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
27288813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
2729a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2730a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2731a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2733a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2748a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
275609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2760a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2761a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2762a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
276409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
27707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
278409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
278509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
279109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
279309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
279809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
279909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
280209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
280409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
280509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
280709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
280809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
280909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
281009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
281109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
281209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
281309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
281409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
281609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2831a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2836a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
28447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2871a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2873a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2878a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2879a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2880a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2881a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2882a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2883a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2884a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2885a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2887a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2888a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2889a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2890a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2891a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2892a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2893a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2894a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2895a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2896a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2897a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2898a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2899a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2900a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2901a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2902a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2904a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2913a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
291409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2916a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
291909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2926a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
292709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
293009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
295409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
295609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
295809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
296209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
296309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
296409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
296509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
296709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
296809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
297009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
297109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
297209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2973a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2974a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2975a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
297798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
2978de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
29790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
2980df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2981df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
2982df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2983df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
2984df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2985df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
2986df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
298742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
298836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2989460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
2990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2993cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
299457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
2995dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2997d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2998be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3005de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30093af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30113af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
30144558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3015a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
30160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30197a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3021e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
302288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
30233af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
30243af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
30254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30310d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30330d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
303488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3035d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
30360d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3038b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3040b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3044de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30479f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
305287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
305392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3054d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3057cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3058ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
305909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3060a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3062de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3063de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3064a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3065a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3067de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30744558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
3075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3077de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3078de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3080de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3081de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3084de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3092de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3094de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3096de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3097de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3098de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3099de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3107094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3137de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
314198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
318250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
318350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
318450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
319050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
319250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
319350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
319450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
319550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
319750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
319950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
320650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
321050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
321150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
321250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
321350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3216ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
321750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
321850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
321950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
322050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
322350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
322450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
322550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
322950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
323350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
323550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
324450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
324950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
325150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
325750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
326850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3297