r600_shader.c revision a6a710cbe7425819e1cd5ad5f2085311c092f2e7
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
1785555cd776b970bce020be59193054474a2a63317Dave Airlie	if (rshader->fs_write_all) {
1795555cd776b970bce020be59193054474a2a63317Dave Airlie		r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL,
1805555cd776b970bce020be59193054474a2a63317Dave Airlie					S_028808_MULTIWRITE_ENABLE(1),
1815555cd776b970bce020be59193054474a2a63317Dave Airlie					S_028808_MULTIWRITE_ENABLE(1),
1825555cd776b970bce020be59193054474a2a63317Dave Airlie					NULL);
1835555cd776b970bce020be59193054474a2a63317Dave Airlie	}
1845555cd776b970bce020be59193054474a2a63317Dave Airlie
1851235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (rshader->uses_kill) {
1861235becaa1cf7e29f580900592563c3329d326deJerome Glisse		/* only set some bits here, the other bits are set in the dsa state */
1871235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate,
1881235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R_02880C_DB_SHADER_CONTROL,
1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1),
1901235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1), NULL);
1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
192738aa29289296512959cbb37d8602131dae44dabDave Airlie	r600_pipe_state_add_reg(rstate,
193738aa29289296512959cbb37d8602131dae44dabDave Airlie				R_03E200_SQ_LOOP_CONST_0, 0x01000FFF,
194738aa29289296512959cbb37d8602131dae44dabDave Airlie				0xFFFFFFFF, NULL);
1951235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1961235becaa1cf7e29f580900592563c3329d326deJerome Glisse
197a6a710cbe7425819e1cd5ad5f2085311c092f2e7Henri Verbeetstatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1981235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2001235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	void *ptr;
2021235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
2041235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
20529c4a15bf61a76cd71ffa5b8f09706d0eab84281Keith Whitwell		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0);
2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
2081235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
209294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
2101235becaa1cf7e29f580900592563c3329d326deJerome Glisse		memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4);
211294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
2121235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
2141235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
2201235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2211235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2221235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
2231235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2241235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
2251235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2261235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
2271235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2281235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
2301235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2341235becaa1cf7e29f580900592563c3329d326deJerome Glisse
23596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian Königint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader, u32 **literals);
236dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
238052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
24096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	u32 *literals;
2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse
243052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König        /* Would like some magic "get_bool_option_once" routine.
244052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König         */
245052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König        if (dump_shaders == -1)
246052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König                dump_shaders = debug_get_bool_option("R600_DUMP_SHADERS", FALSE);
247052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König
248052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
249052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "--------------------------------------------------------------\n");
250052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		tgsi_dump(tokens, 0);
251052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse	shader->shader.family = r600_get_family(rctx->radeon);
25396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	r = r600_shader_from_tgsi(tokens, &shader->shader, &literals);
2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
2551235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_bc_build(&shader->shader.bc);
25996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	free(literals);
2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
2621235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
264052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
265052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		r600_bc_dump(&shader->shader.bc);
266052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
267052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
268afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse
27169251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
272ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
273ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
274ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
275ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	r600_bo_reference(rctx->radeon, &shader->bo, NULL);
276f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck	r600_bc_clear(&shader->shader.bc);
277ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
278ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
2822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
2832b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
2842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
2852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
2862b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
2872b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
2882b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
2892b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
2902b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
2912b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
2922b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
2932b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
294cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
295cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
296e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
297fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
298fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
299fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
300fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
301fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
3022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3032b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3042b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
3052b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
3062b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
3072b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
3082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
3092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3102b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
31150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[];
31242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
32272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
326c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
327a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
33172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
332a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
3348260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
3358260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
3368260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
34147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
34247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
34772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
34872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
349fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
35050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
35150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
35250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
353fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
354fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
355fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
356fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
357fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
358fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
359fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
360fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
364fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
365fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
366fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
367fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
368fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
369fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
370fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
371fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
3727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
373fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
374fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
375fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
37650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
37750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
37850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
37950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
38050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
38150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
38250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
38350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
38450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
38550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
386fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
38750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
38850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
38950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
39050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
395fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
39750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
39850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
39950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
40050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
40150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
40250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
40350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
40450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
4057ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
4067ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4077ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
40972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
41272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
41835e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4198a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
4214afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) {
42250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
423fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
424fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
425fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
426fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
427fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
428fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
42950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
43635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
44033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
44147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
444de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
44872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
44972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
450be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
451be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
452be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
453be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
454be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
4557ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
50296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian Königint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader, u32 **literals)
50372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
5055555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
507c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
508457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
51172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
522f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
525076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
526076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
527076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
528f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
529f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
530f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
532076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
533076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
534076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
535076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
5504afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx.bc->chiprev == CHIPREV_EVERGREEN) {
551f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
552f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
553f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
554f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5564afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) {
557fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
55884457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
563d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
56497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
56597e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
56697e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
567d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
5687728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
572cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
573cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
5745555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
580cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
581cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
582cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
583cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
584cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
585cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
586cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
587cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
588cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
589cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
600be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
601be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
602be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
6044afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher			if (ctx.bc->chiprev == CHIPREV_EVERGREEN)
60550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
60650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
60750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
612876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
6135555cd776b970bce020be59193054474a2a63317Dave Airlie			property = &ctx.parse.FullToken.FullProperty;
6145555cd776b970bce020be59193054474a2a63317Dave Airlie			if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
6155555cd776b970bce020be59193054474a2a63317Dave Airlie				if (property->u[0].Data == 1)
6165555cd776b970bce020be59193054474a2a63317Dave Airlie					shader->fs_write_all = TRUE;
6175555cd776b970bce020be59193054474a2a63317Dave Airlie			}
618876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
626457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
627457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
628c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
629c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
630c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
631c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
632c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
633c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
634c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
6358ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[i].burst_count = 1;
636c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
637c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
638c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
639a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
640457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
643c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
644c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
646457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
647457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
648457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
649457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
650457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
651457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
652457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
657b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
658c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
6595f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
660c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
661b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
66239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
66339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
66439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
66539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
66639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
66739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
66839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
66939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
670c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
68172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
682457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
683457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
684457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
685457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
686457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
687457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
688457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
689457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
690457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
691457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
692457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
693457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
694457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
695457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
698457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
6998ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
700457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
701457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
702457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
7037e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
704457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
706c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
707481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
708481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
709481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
710481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
711481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
712481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
713481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
714481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
715481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
7168ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
717481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
718608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
719481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
720a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
721481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
722481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
723457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
724457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
725457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
726457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
727457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
728b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
729b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
730a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
731c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
732c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
733457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
734457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
735c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
73996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	*literals = ctx.literals;
740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
743cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
7637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
7647728bef29097c8406d35c6dd969544382abdf935Christian König	r600_src->neg = tgsi_src->Register.Negate;
7657728bef29097c8406d35c6dd969544382abdf935Christian König	r600_src->abs = tgsi_src->Register.Absolute;
7669e964baaf34fedec385a750b97fd6684fc52584aHenri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
7677728bef29097c8406d35c6dd969544382abdf935Christian König		int index;
7687728bef29097c8406d35c6dd969544382abdf935Christian König		if((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
7697728bef29097c8406d35c6dd969544382abdf935Christian König			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
7707728bef29097c8406d35c6dd969544382abdf935Christian König			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
7717728bef29097c8406d35c6dd969544382abdf935Christian König
7727728bef29097c8406d35c6dd969544382abdf935Christian König			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
77396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König			r600_bc_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
77496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
7757728bef29097c8406d35c6dd969544382abdf935Christian König				return 0;
7767728bef29097c8406d35c6dd969544382abdf935Christian König		}
777cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
7787728bef29097c8406d35c6dd969544382abdf935Christian König		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
77996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		r600_src->value = ctx->literals + index * 4;
7807728bef29097c8406d35c6dd969544382abdf935Christian König	} else {
7817728bef29097c8406d35c6dd969544382abdf935Christian König		if (tgsi_src->Register.Indirect)
7827728bef29097c8406d35c6dd969544382abdf935Christian König			r600_src->rel = V_SQ_REL_RELATIVE;
7837728bef29097c8406d35c6dd969544382abdf935Christian König		r600_src->sel = tgsi_src->Register.Index;
7847728bef29097c8406d35c6dd969544382abdf935Christian König		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
793de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
7947a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7957a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
796de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
80047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
80147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
8027a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
8037a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
8047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
806de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
807de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
8087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
8097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
8117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
8127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
8137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
8157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
8167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
8177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
8187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
8197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
8207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
8217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
8237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
8257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
8287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
8297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
8327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
8337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
8357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
8367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
8409d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
841be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
8437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
844a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
8467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
84740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid				alu.src[0].rel = r600_src[i].rel;
848be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
8497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
8507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
8517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
8527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
8537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
8547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
8557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
8567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
8579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
85840cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid			r600_src[i].rel =0;
8597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
8607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
8637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
8647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
866be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
867be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
869be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
87020846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee	int i, j, k, nliteral, r;
871be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
872be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
8737728bef29097c8406d35c6dd969544382abdf935Christian König		if (r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) {
874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
876be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
8779d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
8787728bef29097c8406d35c6dd969544382abdf935Christian König		if (j > 0 && r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) {
879be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
880be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
881be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
882a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
884be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
88596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König				alu.src[0].value = r600_src[i].value;
886be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
887be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
888be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
889be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
890be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
891be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
892be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
893be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
894be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
8959d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
8969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			j--;
897be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
898be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
899be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
900be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
901be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
902dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
904dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
905d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
906d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
907dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
908d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
909d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
910d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
911dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
912dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
913dffad730df17983cfaef0808555a8c26cad0aa15Christian König
914dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
915dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
916dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
917dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct r600_bc_alu_src r600_src[3];
918dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct r600_bc_alu alu;
919dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
920dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9259d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
9269d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
9279d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
928d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
929d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
930d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
931d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
933d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
934d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
935d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
9367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
937d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
938d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
9417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
943d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
944d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
945d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
946d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
947d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
948d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
9557a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
9567a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
9577a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
961d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
971d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
972d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
973d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
974d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
977d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
978d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
979d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
980d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
9817ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
98288f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
98388f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
98488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
98588f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
98692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
98792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie			   struct r600_bc_alu_src r600_src[3])
98888f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
98996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
99096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
99196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
99296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
99388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
99496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
99592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
9967ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
99788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
99888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
99988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
10009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
10019d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
10029d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1003be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1005a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
100888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
100988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
101088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
101288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
101396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
10147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1015921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
101796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[1].value = (uint32_t *)&half_inv_pi;
101896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1019ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
102188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
102288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1026a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
10277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
103588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1040a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
104488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
104588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
104888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
10497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1050921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
105188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1052921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1053ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
105496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
105596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	if (ctx->bc->chiprev == CHIPREV_R600) {
105696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].value = (uint32_t *)&double_pi;
105796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].value = (uint32_t *)&neg_pi;
105896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
105996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
106096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
106196f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
106296f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
106396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
106488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
106588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
106688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
106788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
106892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
106992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
107292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
107392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
107492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
107592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
107692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1077dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
107892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
107992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
108092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
108192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
109288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
109388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
109588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
109688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1097be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1098be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1099be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1100be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
110188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1102a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1103be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1104be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
110688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
1108be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
111088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
111188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
111688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
111892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
111992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
112092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
112192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
112292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
112392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
112557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
112657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_setup_trig(ctx, r600_src);
112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
113057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
113157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
113292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
113392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
113657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
113757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
113857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
113957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
114092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
114157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
114257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
114357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
114457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
114557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
114657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
114757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
114892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
114992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
115057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
115157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
115357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
115457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
115557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
115657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
115757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
115857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
115957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
116057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
116157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
116257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
116357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
116492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1178ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1187ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1190ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1191ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1192ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1193ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1194ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1195ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1196ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1197ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1198ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1199ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1200ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1201ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1202ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1203ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1204ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
120592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
120692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
120792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1208094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1209094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1210094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1211094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1212094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1213094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1214094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
12174502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
12194502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1220921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
12214502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
12244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
12254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
12264502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
12274502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
12284502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
12294502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
12304502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1231094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1232094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1233094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1234094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1235094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1236094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1237094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
12384502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
12404502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
12414502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1242094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1243094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1244094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
12450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
12460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
12470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
1249ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	struct r600_bc_alu_src r600_src[3];
12500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
12510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1252ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
1253ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
1254ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
1255d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1256d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
1257d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
1258ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
12597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
12607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1261a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1262921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
12657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
12687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1274a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1275ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	alu.src[0] = r600_src[0];
1276921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
127785e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
12827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
12877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1288a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1289921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
12907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
12917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
12927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
12957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
12967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
13026a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
13036a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
13046a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
13050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
13060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1307a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1308ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
1309ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
13100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13186a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
13196a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
13200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
13220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1323a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1324ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
13257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
13270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1328ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1329ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[2] = r600_src[0];
13307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
13310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
13320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
13330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
13340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
13350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
13410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1342a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
13430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
13440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
13450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
13530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
13540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
13550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
135642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
135742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
135842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
135942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
136042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
136142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
136242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1363df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1364df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1365df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1366df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1367df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1368df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1369df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
137042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
137142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
137242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		if (r)
137342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck			return r;
137442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
137542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
137642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
137742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
137842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
137942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
138042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
138142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
138242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
138342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
138442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
138542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
138642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1387a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
13887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
13897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1391a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
13937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
13947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
13957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1396a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
13977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
13987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
14027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
14037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
14047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
14057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
14067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
14077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
14087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
14097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
14107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1411a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1412a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1415a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1416a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1425a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1426a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1428a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1436a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1443a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1447a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
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;
1454a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1455a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
145666f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1457a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1458a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1459a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1460a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1461a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1462a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1463a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1464a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1465a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1466a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1467a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1468a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1469a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1470a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1471a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1472a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1473a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1474a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1475a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1476a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1477a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1478a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1479a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1480a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
14810d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
14820d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
14830d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14840d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
14850d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1486921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
14870d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14880d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
14890d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
14900d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
14919d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
14929d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
14939d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
14940d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14950d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
14960d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
14970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1498a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
14990d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1500cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
15010d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1502cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
15030d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15040d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
15050d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
15060d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1507921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
15080d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15090d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
15100d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
15110d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
15120d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
15130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15140d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15150d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
15170d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15180d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
15190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
15200d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1521a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
15220d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
15230d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15240d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15250d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15260d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1528cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
15290d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
15300d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1531921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
15320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
15330d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15340d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1535cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
15360d48925a56ad4fb253386110b545abda82a25464Dave Airlie
15370d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
15380d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
15390d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15400d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15410d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15420d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
15430d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
15440d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
15450d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1546cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1547cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1548cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1549cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1550cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1551cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1552cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1553cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1554a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
15556c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1556cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1557a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1558cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1560cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1561cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1562cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1563cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1564cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1565cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1566cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1567cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1568cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1572cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1573cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1580dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
15827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
15837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
15847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
15859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
15869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
15879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
15887be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
15897be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
15907be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
15917be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
15957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
15967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
15987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
15997be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16007be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (r)
16017be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			return r;
16027be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1604cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
16067be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16137be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1614cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1616cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1617cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1618cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1620cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1621cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1622cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome 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;
1629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
16337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
16347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1635cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1636a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
1637a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1638a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		if (r)
1639a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König			return r;
1640a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
1641cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1642a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1643cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1644cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1645cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1646cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1647921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1648cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1649cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1650cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1651cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1652cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1653921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1654cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1655cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1656cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1657e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1658e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1659e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1660e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1661e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1662e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1663e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1664cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1665cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
167733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
167833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
167996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
168033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
168133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1682641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1683641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1684b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1685bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
168693a95ad8ff1d543f886f123029d1329513729c4bChristian König	boolean src_not_temp =
168793a95ad8ff1d543f886f123029d1329513729c4bChristian König		inst->Src[0].Register.File != TGSI_FILE_TEMPORARY &&
168893a95ad8ff1d543f886f123029d1329513729c4bChristian König		inst->Src[0].Register.File != TGSI_FILE_INPUT;
1689641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1690641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1691641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1692b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1693b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1694b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1695a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1696bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1697bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1700b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1701b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1702b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1703b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1704b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1705b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1706b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1707b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
17089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1709b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1710b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1711a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1712b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1713b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1714bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1715bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1716bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1717b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1718b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1719b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1720b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1721b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1722b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1723b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1724b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1725b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1726a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1727921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1728b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1729b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1730b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1731b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1732b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
173607b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1737b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1738bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1739bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1746a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1748bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1749bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1752bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1753bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1754bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1759bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1761bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1762bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
176484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee			default:
176584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				assert(0);
176684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src_chan = 0;
176784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src2_chan = 0;
176884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				break;
1769bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1770bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1771bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1772bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1773bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan);
1774bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1776bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan);
1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1790a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1792bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1794bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1799bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1800bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
18017ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1802bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1803bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
18047ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
1805bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1806bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1807a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1808bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1809bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1810bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1811bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1812bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1813bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
18147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1815bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1816bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
181796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].value = (u32*)&one_point_five;
1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1822bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1823bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1825bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1826bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1827bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1828a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1829bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1830bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1831bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1832bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1833bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
18357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1837bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
183896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].value = (u32*)&one_point_five;
1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1848bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
184907b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1850bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1853bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
1854b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1856a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1857a124490262a29d2e873fe50ca57974f246946b85Christian König			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1858a124490262a29d2e873fe50ca57974f246946b85Christian König			if (r)
1859a124490262a29d2e873fe50ca57974f246946b85Christian König				return r;
1860a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
1861b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1862b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1863b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1864b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
18727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1873bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1874bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1875bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1876bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
187733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
187833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1879bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
1880ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
1881ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.resource_id = tex.sampler_id;
1882641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
18836c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
18849d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
18859d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
18869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
18879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
188833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
188933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
189033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
189133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
18929a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1894bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
190001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
190101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
190201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
19037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
190401984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
190501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
19085d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
1909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
1912bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
1913bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1914bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
1915bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
191633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
191733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1918b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1919b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1920b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1922b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1923dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1924b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1925b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1926b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
19277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
19287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
19297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
19309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
19319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
19329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1933c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
1934c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
1935c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	if(r600_src[0].sel == V_SQ_ALU_SRC_0_5) {
1936c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
1937c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1938c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
1939c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
1940c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			memset(&alu, 0, sizeof(struct r600_bc_alu));
1941c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1942c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.src[0] = r600_src[1];
1943c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
1944c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.src[1] = r600_src[2];
1945c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1946c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
1947c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1948c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
1949c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
1950c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
1951c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
1952c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
1953c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
1954c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
1955c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			r = r600_bc_add_alu(ctx->bc, &alu);
1956c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
1957c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
1958c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
1959c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
1960c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
1961c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1963dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
1964dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1965dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
1966dffad730df17983cfaef0808555a8c26cad0aa15Christian König
1967b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1968a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1969921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1970b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
19717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
19727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1973b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1974b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1975b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1976dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
1977b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1978b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1979b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1980b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1981b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1982b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1983b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1984b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1985b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1986dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
1987dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1988dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
1989dffad730df17983cfaef0808555a8c26cad0aa15Christian König
1990b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1991a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1992b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1993b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
19947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
19957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1996b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1997b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1998dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
1999b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2000b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2001b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2002b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2003b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2004b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2005b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2006b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2007b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2008dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
2009dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
2010dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
2011dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2012b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2013a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2014b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
20157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
20167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
20177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
20187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
2019b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2020b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2021dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2022dffad730df17983cfaef0808555a8c26cad0aa15Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
2023dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (r)
2024dffad730df17983cfaef0808555a8c26cad0aa15Christian König			return r;
2025dffad730df17983cfaef0808555a8c26cad0aa15Christian König
2026b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2027dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
2028b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2029b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2030b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2031b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2032b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2033b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2034dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
2035b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2036b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
203787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
203887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
203987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
204087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
204187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
204287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
2043dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
204487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
204587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
204687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
204787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
20489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20499d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20509d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
205187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
20527be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
20537be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
20547be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
205587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
205687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2057a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
205887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
205987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
206087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
206187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
206287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
206387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
206487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
206587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
206687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
20677be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (r)
20697be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			return r;
20707be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
207187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
207287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
207387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
20747be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
207587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
207687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
207787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
207887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
20797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
208087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
208187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
208287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
20840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
20850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
20870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
20880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
20890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
20900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
20920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
20930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
20950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
20960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
20979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20999d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
21009d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
21010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2103a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
21220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
21280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
21310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
21380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
21390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
21400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
21420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
21430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
21440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
21450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
21460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
21470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
21490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2150a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
21510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
21530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
21560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
21590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
21620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
21650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
21660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
21690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
21700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
21710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
21720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
21740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
21750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
21770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
21780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
21790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
21850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
21860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
21870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
21890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
21900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
21910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
21930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
21940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
21960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
21970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
21980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
21990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
220936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
221036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
221136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
221289c26866f05dcf8fbb716e38d4780cebcae71653Vinson Lee	struct r600_bc_alu_src r600_src[3] = { { 0 } };
221336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
221409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
221636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
221736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
221836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
221936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2220a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
222136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
222236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
222336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
222436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
222536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
222636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
222736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
222836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
222936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
223036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
223136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
223236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
223336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
223436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2235a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
223636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
223736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
223836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
223936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
224036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
224136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
224236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
224336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
224436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
224536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
224636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
22477ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
224836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
224936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
225036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
225136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2252a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
225336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
225436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
225536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
225636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
225736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
225836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
225936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
226036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
226136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
226236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
226336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
226436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
226536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
226636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
226736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
226836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
226936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
227036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
227136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
227236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
227336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
227436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
227536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2276a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
227736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
227836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
227936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
228036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
228136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
228236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
228336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
228436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
228536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
228636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
228736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
228836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
228936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
229036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
229136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
229236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
229336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
229436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
229536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
229636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2297a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
229836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
229936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
230036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
230136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
230236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
230336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
230436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
230536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
230636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
230736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
230836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
230936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
231036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
231187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2312460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2313460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2314460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2315460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2316460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2317460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2318460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2322460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2324460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2326460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2343460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
235196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
235596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
235696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
235796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
235896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
235996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
236096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
236196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
236296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
236396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
236496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
236596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
236696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
236796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
236896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
236996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
237096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
237196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
237296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
237396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
237496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
237596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
237696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
237796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
237896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
237996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
238096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
238196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
238296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
238396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
238496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
238596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
238696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
238796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
238896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
238996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
239096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
239196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
239296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
239396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
239496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
239596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
239696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
239796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
239896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
239996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
240096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
240196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
240296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
240396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
240496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
240596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
240696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
240796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
240896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
240996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
241096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
241196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
241396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
241496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
241596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
241796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
241896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
241996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
242196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
242296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
242396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
242596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
242696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
242796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2428460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2429460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2430460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2431460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2432460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2433460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2434460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2435460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2436460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2437460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2438460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2439460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2440460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2441460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2442460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2443460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2444460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2445460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2446460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2447460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2448460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2449460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2450460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2451460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2452460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2453460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2454460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2455460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2462460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2480460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
248198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
248298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
248398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
248498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct r600_bc_alu alu;
248598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
248698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
248798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
248852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
248952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
249052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
249152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
249252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
249352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
249452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
249552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
249652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
249752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
249852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
249952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
250098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
250198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
250298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
250398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
250498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
250598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.chan = 0;
250698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.sel = ctx->temp_reg;
250798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
2508495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
250998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
251098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
251198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
251298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
251398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
251498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
251598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
251698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].sel = ctx->temp_reg;
251798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
251898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2519495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
252098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
252198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
252298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
252398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
252498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
252547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
252647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
252747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
252847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
252947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
253047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
253147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
25327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
25337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
25347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
25357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
25367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
25377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA;
25387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
25397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
25407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
25417ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
25427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
25437ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
254447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
254547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
254647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
254747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
254847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
254947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
255047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
255147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2552495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
255347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
255447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2555c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
255647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
255747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
255847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
255957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
256057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
256157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
256257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
256357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
256457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
256557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
256657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
256757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2568a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
256957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
257057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
257157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
25727ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
25737ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
257457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
257557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
257657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
257757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
257857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
257957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
258057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
258157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
258257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 2) {
258357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
258457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
258557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]);
258657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
258757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
258857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
258957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
259057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
259157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
259257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
259357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
259457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
259557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
259657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
259757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
259857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2599a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2600a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2601a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2603a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2604a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2605a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2606a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2607a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2608a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2609a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2610a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2611a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2612a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2613a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2614a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2615a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2616a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2617a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2618a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
26197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2620a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2621a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2622a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2623a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2624a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2625a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2626a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2627a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2628a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2629a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
26308813842121d46d1be476807c98b0ba0b771f0c91Christian König	int alu_pop = 3;
26318813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (ctx->bc->cf_last) {
26328813842121d46d1be476807c98b0ba0b771f0c91Christian König		if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
26338813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 0;
26348813842121d46d1be476807c98b0ba0b771f0c91Christian König		else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
26358813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 1;
26368813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
26378813842121d46d1be476807c98b0ba0b771f0c91Christian König	alu_pop += pops;
26388813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (alu_pop == 1) {
26398813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
26408813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
26418813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else if (alu_pop == 2) {
26428813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
26438813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
26448813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else {
26458813842121d46d1be476807c98b0ba0b771f0c91Christian König		r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
26468813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
26478813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
26488813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
2649a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2650a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2651a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2653a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
265509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
265809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2668a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2680a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2681a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2682a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
268509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
268709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
268809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
268909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
26907ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
269109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
269209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
269309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
269409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
269609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
269709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
269809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
269909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
270009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
270109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
270209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
270309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
270409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
270509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
270609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
270709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
270809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
270909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
271009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
271109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
271609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2720a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
272109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
272209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2723a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
272509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
272909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
273509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2751a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2756a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
27647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
277009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
278309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
278409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
278509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
278609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
278709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
278809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
278909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
279009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2791a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
279209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2793a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
279409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
279509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
279609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
279709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2799a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2803a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
280609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2808a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2810a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2813a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2815a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2817a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2818a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2819a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2820a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2821a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2822a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2824a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
283109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2833a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2836a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
284309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
284409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
284509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2846a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
285309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
288009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
288309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
288509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
288609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2893a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2894a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2895a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
289798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
2898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
28990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
2900df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2901df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
2902df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2903df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
2904df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2905df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
2906df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
290742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
290836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2909460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
2910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2912cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2913cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
291457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
2915dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2917d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2918be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
2920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2921b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
2922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29293af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
2930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29313af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
2932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
29344558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
2935a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
29360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
2937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29397a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
2940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2941e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
294288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
29433af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
29443af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
29454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
2952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29530d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
295488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
2955d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
29560d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
2957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2958b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2960b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29679f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
2968de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2969de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29710d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
297287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
297392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
2974d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
2975de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2977cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2978ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
297909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
2980a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
2981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2982de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2983de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2984a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
2985a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
2986de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2987de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2988de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2989de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2990de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2991de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2992de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2993de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
29944558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
2995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2997de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2998de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2999de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3000de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3001de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3002de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3003de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3004de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3014de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3017de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3020de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3027094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3029de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3032de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3033de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3034de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3035de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3036de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3037de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3039de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3040de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3041de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3042de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3043de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3044de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3046de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3047de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3049de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3050de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3051de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3052de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3053de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3054de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
305950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
306050526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
306198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
306250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
306350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
306450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
306550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
306650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
306750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
306950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
307050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
307150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
307250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
307350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
307450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
307550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
307650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
307750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
307850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
307950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
308050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
308250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
308550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
308850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
309050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
309250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
309350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
309450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
309550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
309650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
309850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
310050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
310150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
310250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
310350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
310450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
311050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
311250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
311350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
311450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
311550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
311750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
311850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
311950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
312650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
312950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
313050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
313150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
313250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
313350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
313550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3136ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
313750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
313850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
313950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
314050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
314350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
314450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
314550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
314950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
315350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
315550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
315950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
316450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
316750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
316950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
317150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
317750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
318650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
318750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
318850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
318950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
319950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
320950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
321650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3217