r600_shader.c revision a77e813de32643ae2dfffd7ad12abed596172cab
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
2353b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
2363b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet
237dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
239052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	static int dump_shaders = -1;
2401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
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);
2533b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	r = r600_shader_from_tgsi(tokens, &shader->shader);
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);
2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
2621235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
263052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	if (dump_shaders) {
264052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		r600_bc_dump(&shader->shader.bc);
265052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König		fprintf(stderr, "______________________________________________________________\n");
266052b9e8fab2e7deddf7f287d63c45aa938e5ec67Christian König	}
267afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	return r600_pipe_shader(ctx, shader);
2681235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2691235becaa1cf7e29f580900592563c3329d326deJerome Glisse
27069251fc4cd5f71be403e08398bc43d19052a640dJerome Glissevoid r600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
271ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
272ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
273ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
274ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	r600_bo_reference(rctx->radeon, &shader->bo, NULL);
275f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck	r600_bc_clear(&shader->shader.bc);
276ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
277ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
2812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
2822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
283a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstruct r600_shader_src {
284a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				sel;
285a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				swizzle[4];
286a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				neg;
287a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				abs;
288a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	unsigned				rel;
289a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	uint32_t				value[4];
290a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet};
291a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
2922b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
2932b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
2942b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
2952b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
2962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
2972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
2982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
2992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
3002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
3012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
302cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
303cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
304e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
305fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
306fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
307fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
308fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
309fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
3102b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3112b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3122b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
3132b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
3142b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
3152b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
3162b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
3172b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3182b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
31950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[];
32042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
33072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
334c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
335a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
33972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
340a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
3428260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
3438260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
3448260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
34947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
35047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
35572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
35672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
357fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
35850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
35950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
36050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
361fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
362fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
363fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
364fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
365fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
366fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
367fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
368fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
369fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
370fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
371fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
372fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
373fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
374fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
375fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
376fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
377fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
378fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
379fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
3807ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
381fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
382fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
383fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
38450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
38550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
38650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
38750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
38850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
38950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
39050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
39150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
39250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
39350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
394fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
39550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
39650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
39750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
39850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
399fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
400fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
401fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
402fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
403fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
40450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
40550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
40650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
40750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
40850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
40950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
41050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
41150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
41250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
4137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
4147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
41772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
42072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
42635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
4278a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
4294afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) {
43050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
431fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
432fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
433fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
434fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
435fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
436fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
43750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
443de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
44435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
44833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
44947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
45672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
45772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
458be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
459be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
460be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
461be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
462be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
4637ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
464fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
468fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
469fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
470fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
471fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
472fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
473fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
474fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
475fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
476fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
477fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
479fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
480fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
481fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
482fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
488fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
489fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
490fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
491fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
492fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
493fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
494fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
495fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
496fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
497fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
498fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
499fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
500fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
501fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
502fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
503fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
504fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
505fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
506fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
507fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
508fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
509fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
5103b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeetstatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
51172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
5135555cd776b970bce020be59193054474a2a63317Dave Airlie	struct tgsi_full_property *property;
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
515c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
51972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
530f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
533076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
534076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
535076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
536f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,511] correspond to cfile constants c[0..255]. (Gone on EG)
537f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [256,287] correspond to constant buffer bank 2 (EG)
538f39dfa0ab08d1328110afb5ed0ed16a8b5e3fbdaHenri Verbeet	 * Values [288,319] correspond to constant buffer bank 3 (EG)
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
540076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
541076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
542076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
543076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
5584afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx.bc->chiprev == CHIPREV_EVERGREEN) {
559f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
560f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
561f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
562f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5644afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) {
565fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
56684457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
571d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
57297e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	/* Outside the GPR range. This will be translated to one of the
57397e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	 * kcache banks later. */
57497e2aa31c6e735d5f6bd1d67a4dd8da2605aedc8Henri Verbeet	ctx.file_offset[TGSI_FILE_CONSTANT] = 512;
575d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
5767728bef29097c8406d35c6dd969544382abdf935Christian König	ctx.file_offset[TGSI_FILE_IMMEDIATE] = V_SQ_ALU_SRC_LITERAL;
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
580cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
581cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
5825555cd776b970bce020be59193054474a2a63317Dave Airlie	shader->fs_write_all = FALSE;
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
588cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
589cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
590cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
591cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
592cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
593cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
594cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
595cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
596cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
597cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
599de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
604de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
608be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
609be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
610be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
6124afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher			if (ctx.bc->chiprev == CHIPREV_EVERGREEN)
61350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
61450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
61550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
620876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie		case TGSI_TOKEN_TYPE_PROPERTY:
6215555cd776b970bce020be59193054474a2a63317Dave Airlie			property = &ctx.parse.FullToken.FullProperty;
6225555cd776b970bce020be59193054474a2a63317Dave Airlie			if (property->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) {
6235555cd776b970bce020be59193054474a2a63317Dave Airlie				if (property->u[0].Data == 1)
6245555cd776b970bce020be59193054474a2a63317Dave Airlie					shader->fs_write_all = TRUE;
6255555cd776b970bce020be59193054474a2a63317Dave Airlie			}
626876effb0e717e8e64050662f6ffa286c22065f5cDave Airlie			break;
627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
634457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
635457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
636c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
637c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
638c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
639c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
640c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
641c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
642c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
6438ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[i].burst_count = 1;
644c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
645c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
646c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
647a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
648457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
651c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
652c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
654457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
655457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
656457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
657457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
658457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
659457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
660457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
665b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
666c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
6675f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
668c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
669b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
67039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
67139d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
67239d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
67339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
67439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
67539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
67639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
67739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
678c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
68972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
690457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
691457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
692457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
693457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
694457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
695457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
696457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
697457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
698457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
699457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
700457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
701457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
702457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
703457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
704457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
705457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
706457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
7078ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König			output[i].burst_count = 1;
708457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
709457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
710457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
7117e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
712457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
714c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
715481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
716481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
717481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
718481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
719481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
720481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
721481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
722481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
723481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
7248ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König		output[0].burst_count = 1;
725481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
726608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
727481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
728a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
729481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
730481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
731457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
732457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
733457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
734457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
735457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
736b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
737b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
738a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
739c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
740c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
741457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
742457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
743c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
7473b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet	free(ctx.literals);
748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
751cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
767a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic void r600_bc_src(struct r600_bc_alu_src *bc_src,
768a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			const struct r600_shader_src *shader_src,
769a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			unsigned chan)
770a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet{
771a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->sel = shader_src->sel;
772a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->chan = shader_src->swizzle[chan];
773a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->neg = shader_src->neg;
774a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->abs = shader_src->abs;
775a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->rel = shader_src->rel;
776a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	bc_src->value = shader_src->value[bc_src->chan];
777a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet}
778a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
779d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeetstatic void tgsi_src(struct r600_shader_ctx *ctx,
780d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeet		     const struct tgsi_full_src_register *tgsi_src,
781a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		     struct r600_shader_src *r600_src)
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
783a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	memset(r600_src, 0, sizeof(*r600_src));
784a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_src->swizzle[0] = tgsi_src->Register.SwizzleX;
785a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_src->swizzle[1] = tgsi_src->Register.SwizzleY;
786a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_src->swizzle[2] = tgsi_src->Register.SwizzleZ;
787a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_src->swizzle[3] = tgsi_src->Register.SwizzleW;
7887728bef29097c8406d35c6dd969544382abdf935Christian König	r600_src->neg = tgsi_src->Register.Negate;
7897728bef29097c8406d35c6dd969544382abdf935Christian König	r600_src->abs = tgsi_src->Register.Absolute;
7909e964baaf34fedec385a750b97fd6684fc52584aHenri Verbeet	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
7917728bef29097c8406d35c6dd969544382abdf935Christian König		int index;
7927728bef29097c8406d35c6dd969544382abdf935Christian König		if((tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleY) &&
7937728bef29097c8406d35c6dd969544382abdf935Christian König			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleZ) &&
7947728bef29097c8406d35c6dd969544382abdf935Christian König			(tgsi_src->Register.SwizzleX == tgsi_src->Register.SwizzleW)) {
7957728bef29097c8406d35c6dd969544382abdf935Christian König
7967728bef29097c8406d35c6dd969544382abdf935Christian König			index = tgsi_src->Register.Index * 4 + tgsi_src->Register.SwizzleX;
79796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König			r600_bc_special_constants(ctx->literals[index], &r600_src->sel, &r600_src->neg);
79896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König			if (r600_src->sel != V_SQ_ALU_SRC_LITERAL)
799d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeet				return;
8007728bef29097c8406d35c6dd969544382abdf935Christian König		}
801cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
8027728bef29097c8406d35c6dd969544382abdf935Christian König		r600_src->sel = V_SQ_ALU_SRC_LITERAL;
8033b1c1f02537544a11772b94a8f2e8c3d4c886ca8Henri Verbeet		memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
8047728bef29097c8406d35c6dd969544382abdf935Christian König	} else {
8057728bef29097c8406d35c6dd969544382abdf935Christian König		if (tgsi_src->Register.Indirect)
8067728bef29097c8406d35c6dd969544382abdf935Christian König			r600_src->rel = V_SQ_REL_RELATIVE;
8077728bef29097c8406d35c6dd969544382abdf935Christian König		r600_src->sel = tgsi_src->Register.Index;
8087728bef29097c8406d35c6dd969544382abdf935Christian König		r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
81280235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeetstatic void tgsi_dst(struct r600_shader_ctx *ctx,
81380235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     const struct tgsi_full_dst_register *tgsi_dst,
81480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     unsigned swizzle,
81580235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		     struct r600_bc_alu_dst *r600_dst)
816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
8177a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8187a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
82347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
82447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
8257a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
8267a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
8277a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
830a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_shader_src r600_src[3])
8317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
8347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
8357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
8377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
8387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
8397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
840d0f2ffad76f58a14d0e85f2b7961f2dbff0d8eebHenri Verbeet		tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
8417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
8439d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
844be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
8457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
8467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
847a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
8497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
85040cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid				alu.src[0].rel = r600_src[i].rel;
851be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
8527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
8537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
8547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
8557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
8567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
8577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
8587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
8597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
8609d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
86140cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid			r600_src[i].rel =0;
8627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
8637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
8647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
8667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
8677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
869a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeetstatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_shader_src r600_src[3])
870be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
871be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
872be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
87320846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee	int i, j, k, nliteral, r;
874be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
875be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
8767728bef29097c8406d35c6dd969544382abdf935Christian König		if (r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) {
877be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
878be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
879be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
8809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
8817728bef29097c8406d35c6dd969544382abdf935Christian König		if (j > 0 && r600_src[i].sel == V_SQ_ALU_SRC_LITERAL) {
882be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
883be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
884be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
885a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
8869d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
887be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
888a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet				alu.src[0].value = r600_src[i].value[k];
889be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
890be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
891be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
892be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
893be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
894be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
895be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
896be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
897be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
8989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
8999d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			j--;
900be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
901be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
902be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
903be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
904be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
905dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_last_instruction(unsigned writemask)
906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
907dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, lasti = 0;
908d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
909d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
910dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (writemask & (1 << i)) {
911d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
912d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
913d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
914dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return lasti;
915dffad730df17983cfaef0808555a8c26cad0aa15Christian König}
916dffad730df17983cfaef0808555a8c26cad0aa15Christian König
917dffad730df17983cfaef0808555a8c26cad0aa15Christian Königstatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
918dffad730df17983cfaef0808555a8c26cad0aa15Christian König{
919dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
920a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
921dffad730df17983cfaef0808555a8c26cad0aa15Christian König	struct r600_bc_alu alu;
922dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int i, j, r;
923dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9289d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
9299d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
9309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
931d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
932d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
933d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
934d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
93680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
938d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
939d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
941a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet				r600_bc_src(&alu.src[j], &r600_src[j], i);
942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
943d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
944a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[1], i);
945a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[0], i);
946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
9527a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
9537a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
9547a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
958d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
968d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
969d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
970d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
971d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
972d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
973d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
974d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
975d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
976d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
977d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
9787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
97988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
98088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
98188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
98288f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
98392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
984a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			   struct r600_shader_src r600_src[3])
98588f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
98696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float half_inv_pi = 1.0 /(3.1415926535 * 2);
98796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float double_pi = 3.1415926535 * 2;
98896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float neg_pi = -3.1415926535;
98996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
99096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	int r;
99192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
9927ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
99388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
99488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
99588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
9969d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
9979d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
9989d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
999be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
100088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1001a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
100288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
100388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
100488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
100588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
100688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
100788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
1008a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_bc_src(&alu.src[0], &r600_src[0], 0);
10097ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1010921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
101188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1012a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	alu.src[1].value = *(uint32_t *)&half_inv_pi;
101396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	alu.src[2].sel = V_SQ_ALU_SRC_0_5;
1014ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
101588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
101688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
101788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
101888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
101988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1021a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
10227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
102388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
102488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
102588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
102688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
102788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
102888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
102988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
103088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
103188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
103288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
103388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
103488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1035a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
103688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
103788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
103888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
103988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
104088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
104188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
104288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
104388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
10447ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1045921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
104688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1047921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1048ac6334145ec8eef42505cdd727aed7fae0831e12Christian König	alu.src[2].chan = 0;
104996f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
105096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	if (ctx->bc->chiprev == CHIPREV_R600) {
1051a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[1].value = *(uint32_t *)&double_pi;
1052a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&neg_pi;
105396f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	} else {
105496f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[1].sel = V_SQ_ALU_SRC_1;
105596f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].sel = V_SQ_ALU_SRC_0_5;
105696f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König		alu.src[2].neg = 1;
105796f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	}
105896f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König
105988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
106088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
106188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
106288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
106392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
106492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
106592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
106692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
106792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
106892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1069a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
107092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
107192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1072dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
107392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
107492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
107592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
107692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
107788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
107888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
107988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
108088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
108188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
108288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
108388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
108488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
108588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
108688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
108788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
1092be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1093be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1094be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1095be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
109688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1097a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1098be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1099be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
110080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1101be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
110288f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
110488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
110588f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
110688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
110788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
110888f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
110988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
111192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
111292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1113a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
111492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
111592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
111692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
111757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
111857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
111957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
112057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
112157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_setup_trig(ctx, r600_src);
112257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
112357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
112457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
112592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
112692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
112757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
112857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
112957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
113080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
113192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
113257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
113357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
113457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
113557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
113657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
113757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
113857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
113992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
114092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
114157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
114257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
114357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
114480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
114557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
114657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
114757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
114857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
114957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
115057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
115157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
115257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
115392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1154ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1155ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1156ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1157ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1158ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1159ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
116080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1161ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1162ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1163ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1164ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1165ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1166ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1167ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1168ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1169ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1170ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1171ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1172ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1173ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1174ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1175ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1176ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1177ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
117880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1179ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1180ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1181ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1182ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1183ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1184ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1185ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1186ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1187ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1188ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1189ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
119092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
119192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
119292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1193094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1194094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1195094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1196094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1197094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1198094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1199094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1200094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1201094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
12024502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1203094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
12044502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1205921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
12064502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12074502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
12084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
12094502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
12104502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
1211a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			struct r600_shader_src r600_src;
1212a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			tgsi_src(ctx, &inst->Src[0], &r600_src);
1213a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src, i);
12144502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1215094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1216094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1217094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1218094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1219094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1220094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1221094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
12224502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
12234502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
12244502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
12254502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1226094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1227094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1228094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
12290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
12300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
12310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1232a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
12330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
12340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
12350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1236ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
1237ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
1238ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
1239d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1240d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
1241d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
1242ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
12437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
12447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1245a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1246921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
124880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
12497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
12507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
12557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1256a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1257a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_bc_src(&alu.src[0], &r600_src[0], 0);
1258921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
125985e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
126080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
12617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
12627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1268a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1269921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
12707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
127180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet	tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
12770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
12790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
12806a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
12816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
12826a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
12830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
12840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1285a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1286a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src[0], 1);
128780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
12880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
12890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
12900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
12910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
12920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12936a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
12946a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
12950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
12960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
12970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1298a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1299a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src[0], 3);
13000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
13010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1302ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1303a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[2], &r600_src[0], 0);
13040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
13050bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
13060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
13070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
13080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
13130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
13140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1315a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
13160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
13170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
131880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
13190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
13200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
13210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
13220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
13230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
13240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
13250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
13260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
132742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
132842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
132942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
133042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
133142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
133242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
133342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1334df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1335df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1336df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1337df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1338df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1339df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1340df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
134142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1342a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		struct r600_shader_src r600_src;
1343a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1344a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		tgsi_src(ctx, &inst->Src[i], &r600_src);
1345a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[i], &r600_src, 0);
134642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
134742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
134842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
134942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
135042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
135142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
135242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
135342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
135442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
135542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
135642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
135742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1358a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
13597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
13607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1362a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
13637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
13647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
13657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
13667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1367a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
13687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
136980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
13707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
13717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
13727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
13737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
13747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
13757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
13767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
13777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
13787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
13797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1380a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1381a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1382a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1383a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src;
1384a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1385a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1386a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1387a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1388a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1389a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1390a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		tgsi_src(ctx, &inst->Src[i], &r600_src);
1391a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[i], &r600_src, 0);
1392a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1393a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1394a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1395a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1396a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1397a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1398a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1399a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1400a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1401a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1402a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1403a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1404a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1405a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1406a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[2];
1407a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1408a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1409a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1410a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[0], &r600_src[0]);
1411a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[1], &r600_src[1]);
1412a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1413a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1414a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1415a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1416a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_bc_src(&alu.src[0], &r600_src[0], 0);
1417a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1418a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1419a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1420a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1421a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1422a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1423a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1424a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
142566f55de31e15f97ad1d16c573756738218c02109Fredrik Höglund	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1426a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_bc_src(&alu.src[0], &r600_src[1], 0);
1427a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1428a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1429a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1430a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1431a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1432a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1433a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1434a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1435a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1436a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1437a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1438a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1439a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1440a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1441a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1442a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1443a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1444a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1445a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1446a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
14470d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
14480d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
14490d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1450a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
14510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
1452921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
14530d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14540d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
14550d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
14560d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
14579d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
14589d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
14599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
14600d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14610d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
14620d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
14630d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1464a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
14650d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1466cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
14670d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1468cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
14690d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1470a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src[0], i);
1471921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
1472a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[2], &r600_src[0], i);
14730d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14740d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
14750d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
14760d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
14770d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
14780d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
14790d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
14800d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14810d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
14820d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
14830d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1484a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
14850d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
148680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14870d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14880d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1489cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
14900d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
14910d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1492921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
14930d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
14940d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14950d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1496cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
14970d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14980d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
14990d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
15000d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15010d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
15020d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
15030d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
15040d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
15050d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
15060d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1507cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1508cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1509cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1510cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1511cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1512cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1513cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1514cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1515a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
15166c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1517cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1518a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
151980235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1520cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1521cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1522cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1523cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1524cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1525cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1526cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1527cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1528cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1529cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1530cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1531cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1532cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1536a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
1537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1539dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
15417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
15427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
15437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
15449d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
15459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
15469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
15477be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
15487be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
15497be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
15507be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
1551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1554a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[j], &r600_src[j], i);
1555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
15567be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König
155780235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1559cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
15617be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti) {
1562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
15687be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1569cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1570cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1572cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1573cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1574a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
1575cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1576cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1577cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
15787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
15797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
15807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
15819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
15829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
15839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1586cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1587cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
1588a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[j], &r600_src[j], i);
1589cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1590a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König
159180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1592cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1593a1146c1373e66d429afbb92ecb08a6fd67c3e224Christian König		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
1594cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1595cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1596cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1597cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1598921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1599cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1600cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1601cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1602cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1603cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1604921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1605cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1606cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1607cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1608e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1609e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1610e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1611e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1612e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1613e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1614e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1615cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1616cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
16257be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	return 0;
1626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
162833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
162933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
163096f8f8db7bcddec7ef0fce62cf0e23f1c2fb8c8dChristian König	static float one_point_five = 1.5f;
163133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
163233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1633641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1634641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1635b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1636bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
163793a95ad8ff1d543f886f123029d1329513729c4bChristian König	boolean src_not_temp =
163893a95ad8ff1d543f886f123029d1329513729c4bChristian König		inst->Src[0].Register.File != TGSI_FILE_TEMPORARY &&
163993a95ad8ff1d543f886f123029d1329513729c4bChristian König		inst->Src[0].Register.File != TGSI_FILE_INPUT;
1640641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1641641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1642641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1643b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1644a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		struct r600_shader_src r600_src;
1645a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1646b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1647b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1648a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1649a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		tgsi_src(ctx, &inst->Src[0], &r600_src);
1650a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 3);
1651bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1652b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1653b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1654b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1655b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1656b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1657b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1658b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
16599d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1660b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1661b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1662a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1663b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1664b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1665a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src, i);
1666b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1667b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1668b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1669b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1670b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1671b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1672b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1673b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1674a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1675921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1676b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1677b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1678b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1679b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1680b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1681b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1682b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1683b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
168407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1685b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1686bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1687bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1688bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1689a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		struct r600_shader_src r600_src;
1690bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1691bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1692a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		tgsi_src(ctx, &inst->Src[0], &r600_src);
1693a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1694bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1695bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1696bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1697a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1700bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1701bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1702bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1703bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1704bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1705bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1706bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1707bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1708bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1709bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1710bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1711bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1712bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1713bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1714bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
171584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee			default:
171684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				assert(0);
171784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src_chan = 0;
171884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src2_chan = 0;
171984b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				break;
1720bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1721a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src, src_chan);
1722a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src, src2_chan);
1723bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1724bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1725bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1726bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1727bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1728bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1729bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1730bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1731bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1732bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1733bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1734bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1735a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1736bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1737bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1738bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1739bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1740bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1741bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1742bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
17467ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1748bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
17497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1751bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1752a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1753bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1754bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1755bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1756bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1757bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1758bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
17597ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1760bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1761bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1762a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1763bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1766bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1767bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1768bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1769bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1770bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1771bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1772bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1773a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1774bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1775bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1776bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1779bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
17807ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1783a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		alu.src[2].value = *(uint32_t *)&one_point_five;
1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1788bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1789bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1790bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1791bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1792bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1793bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
179407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1795bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1796bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1797bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1798bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
1799a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		struct r600_shader_src r600_src;
1800a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
1801a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		tgsi_src(ctx, &inst->Src[0], &r600_src);
1802b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1803b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1804a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1805a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src, i);
1806b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1807b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1808b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1809b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1810b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1811b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1812b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1813b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1814b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1815b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1816b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
18177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1818bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1819bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1820bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1821bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
182233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
182333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1824bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
1825ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
1826ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.resource_id = tex.sampler_id;
1827641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
18286c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
18299d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
18309d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
18319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
18329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
183333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
183433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
183533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
183633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
18379a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1838bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1839bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1840bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1841bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1842bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1843bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
184501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
184601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
184701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
18487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
184901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
185001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
1851bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1852bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
18535d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
1854bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1855bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
1856bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
1857bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
1858bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1859bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
1860bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
186133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
186233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1863b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1864b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1865b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1866a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
1867b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1868dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
1869b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1870b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1871b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
18727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
18737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
18747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
18759d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
18769d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
18779d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1878c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
1879c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	/* optimize if it's just an equal balance */
1880c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	if(r600_src[0].sel == V_SQ_ALU_SRC_0_5) {
1881c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		for (i = 0; i < lasti + 1; i++) {
1882c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1883c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				continue;
1884c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
1885c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			memset(&alu, 0, sizeof(struct r600_bc_alu));
1886c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1887a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[1], i);
1888a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[2], i);
1889c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.omod = 3;
189080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1891c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			alu.dst.chan = i;
1892c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (i == lasti) {
1893c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				alu.last = 1;
1894c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			}
1895c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			r = r600_bc_add_alu(ctx->bc, &alu);
1896c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König			if (r)
1897c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König				return r;
1898c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		}
1899c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König		return 0;
1900c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König	}
1901c60cb25bfb15fc83e78d9f2c74646dcc5ad07792Christian König
1902b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1903dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
1904dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1905dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
1906dffad730df17983cfaef0808555a8c26cad0aa15Christian König
1907b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1908a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1909921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1910b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
1911a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[1], &r600_src[0], i);
1912b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1913b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1914b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1915dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
1916b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1917b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1918b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1919b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1920b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1921b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1922b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1923b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1924b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1925dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
1926dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1927dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
1928dffad730df17983cfaef0808555a8c26cad0aa15Christian König
1929b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1930a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1931b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1932b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
1933a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[1], &r600_src[2], i);
1934b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1935b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1936dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
1937b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1938b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1939b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1940b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1941b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1942b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1943b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1944b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1945b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1946dffad730df17983cfaef0808555a8c26cad0aa15Christian König	for (i = 0; i < lasti + 1; i++) {
1947dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1948dffad730df17983cfaef0808555a8c26cad0aa15Christian König			continue;
1949dffad730df17983cfaef0808555a8c26cad0aa15Christian König
1950b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1951a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1952b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
1953a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src[0], i);
1954a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[1], &r600_src[1], i);
1955b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1956b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1957dffad730df17983cfaef0808555a8c26cad0aa15Christian König
195880235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1959b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1960dffad730df17983cfaef0808555a8c26cad0aa15Christian König		if (i == lasti) {
1961b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1962b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1963b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1964b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1965b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1966b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1967dffad730df17983cfaef0808555a8c26cad0aa15Christian König	return 0;
1968b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1969b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
197087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
197187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
197287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1973a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
197487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
197587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
1976dffad730df17983cfaef0808555a8c26cad0aa15Christian König	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
197787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
197887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
197987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
198087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
19819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
19829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
19839d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
198487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
19857be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König	for (i = 0; i < lasti + 1; i++) {
19867be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
19877be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König			continue;
198887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
198987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1990a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
1991a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src[0], i);
1992a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[1], &r600_src[2], i);
1993a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[2], &r600_src[1], i);
199480235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
199587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
199687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
199787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
19987be5455796facbe35cf1f1bdbefa83759b2e3b58Christian König		if (i == lasti)
199987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
200087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
200187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
200287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
20037ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
200487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
200587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
200687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
20070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
20080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
20090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2010a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[3];
20110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
20120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
20130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
20140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
20160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
20170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
20190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
20200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
20219d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20229d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20239d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
20249d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
20250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
20260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2027a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
20280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
20300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
2031a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[0], 2);
20320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
2034a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[0], 0);
20350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
2037a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[0], 1);
20380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
20400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
20410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
20420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
20430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
20450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
2046a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[1], 1);
20470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
2049a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[1], 2);
20500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
2052a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[1], 0);
20530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
20550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
20560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
20570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
20580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
20600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
20610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
20620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
20640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
20650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
20660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
20670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
20680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
20690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
20710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2072a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
20730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
20750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
2076a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[0], 1);
20770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
2079a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[0], 2);
20800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
2082a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[0], 0);
20830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
20850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
20860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
20870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
20880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
20900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
2091a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[1], 2);
20920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
2094a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[1], 0);
20950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
2097a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[1], 1);
20980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
21000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
21010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
21020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
21030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
21050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
21060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
21070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
21080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
21090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
211080235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		else
211180235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet			tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
21120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
21130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
21140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
21150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
21160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
21170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
21180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
21190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
21200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
21210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
21220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
21230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
21240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
21250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
212636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
212736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
212836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2129a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src;
213036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
213109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
213236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2133a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[0], &r600_src);
2134a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
213536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
213636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
213736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
213836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2139a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2140a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 0);
214136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
214236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
214336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
214436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
214536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
214636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
214736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
214836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
214936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2150a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
215136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
215236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
215336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
215436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
215536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
215636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
215736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
215836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
215936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
216036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
216136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
21627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
216336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
216436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
216536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
216636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2167a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
2168a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 0);
216936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
217036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
217136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
217236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
217336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
217436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
217536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
217636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
217736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
217836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
217936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
218036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
218136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
218236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
218336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
218436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
218536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
218636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2187a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
2188a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 0);
218936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
219036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
219136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
219236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
219336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
219436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
219536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
219636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
219736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
219836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
219936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
220036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
220136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
220236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
220336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
220436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2205a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
220636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
220736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
220836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
220936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
221036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
221136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
221236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
221336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
221436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
221536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
221636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
221736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
221836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
221987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2220460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2221460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2222460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2223a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src;
2224460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2225460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2226460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2227a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[0], &r600_src);
2228a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
2229460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2230460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2231460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2232460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2233460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2234a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 0);
2235460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2236460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2237460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2238460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2239460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2240460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2241460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2242460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2243460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2244460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2245460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2246460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2247460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2248460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2249460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2250460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2251460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2252460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2253460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2254460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2255460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2256460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2257460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
225896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2259460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2260460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2261460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
226296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2263a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 0);
226496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
226596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
226696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
226796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
226896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
226996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
227096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
227196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
227296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
227396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
227496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
227596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
227696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
227796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
227896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
227996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
228096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
228196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
228296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
228396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
228496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
228596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
228696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
228796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
228896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
228996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
229096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
229196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
229296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
229396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
229496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
229596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
229696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
229796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
229896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
229996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
230096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
230196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
230296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
230396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
230496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
230596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
230696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
230796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
230896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
230996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
231096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
231196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
231296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
231396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
231496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
231596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
231696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
231796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
231896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
231996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
232096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
232196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
232296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
2323a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 0);
232496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
232596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
232696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2343a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		r600_bc_src(&alu.src[0], &r600_src, 0);
2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2351460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2355460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2358460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2362460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2363460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2364460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2365460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2366460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2367460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2368460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2369460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2370460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2371460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2372460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2373460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2374460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2375460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
237698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
237798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
237898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2379a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src;
238098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct r600_bc_alu alu;
238198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
2382a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
2383a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[0], &r600_src);
2384a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
238598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
238698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
238752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
238852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
238952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
239052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
239152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
239252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
239352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
239452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
239552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
239652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
239752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
239852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
2399a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_bc_src(&alu.src[0], &r600_src, 0);
240098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
240198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.chan = 0;
240298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.sel = ctx->temp_reg;
240398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
2404495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
240598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
240698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
240798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
240898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
240998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].sel = ctx->temp_reg;
241098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
241198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
2412495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
241398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
241498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
241598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
241698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
241798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
241847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
241947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
242047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2421a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src;
242247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
242347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
2424a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
2425a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[0], &r600_src);
2426a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
242747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
242847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
24297ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
24307ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
24317ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
24327ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
24337ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
24347ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA;
24357ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
24367ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
24377ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
24387ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
24397ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
24407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2441a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_bc_src(&alu.src[0], &r600_src, 0);
244247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
244347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
244447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2445495dec0a2bcdff10f9a4024b892501c54e29ef00Henri Verbeet	r = r600_bc_add_alu(ctx->bc, &alu);
244647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
244747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2448c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
244947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
245047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
245147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
245257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
245357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
245457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2455a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src[2];
245657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
245757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
245857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2459a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[0], &r600_src[0]);
2460a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[1], &r600_src[1]);
2461a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
246257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
246357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
246457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2465a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
246680235d92e6f0b2ac7b23d5d41b3f1ad0f12f91f2Henri Verbeet		tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
24677ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
24687ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
246957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
247057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
2471a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[0], &r600_src[0], i);
247257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
247357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2474a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet		if (i == 0 || i == 2) {
247557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
247657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
2477a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet			r600_bc_src(&alu.src[1], &r600_src[1], i);
247857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
247957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
248057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
248157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
248257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
248357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
248457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
248557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
248657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
248757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2488a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2489a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2490a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2491a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	struct r600_shader_src r600_src;
249209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2493a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2494a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2495a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	tgsi_src(ctx, &inst->Src[0], &r600_src);
2496a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet
2497a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2498a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2499a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2500a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2501a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2502a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2503a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2504a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2505a77e813de32643ae2dfffd7ad12abed596172cabHenri Verbeet	r600_bc_src(&alu.src[0], &r600_src, 0);
2506a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2507a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
25087ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2509a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2510a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2511a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2512a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2513a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2514a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2515a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2516a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2517a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2518a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
25198813842121d46d1be476807c98b0ba0b771f0c91Christian König	int alu_pop = 3;
25208813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (ctx->bc->cf_last) {
25218813842121d46d1be476807c98b0ba0b771f0c91Christian König		if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU) << 3)
25228813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 0;
25238813842121d46d1be476807c98b0ba0b771f0c91Christian König		else if (ctx->bc->cf_last->inst == CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3)
25248813842121d46d1be476807c98b0ba0b771f0c91Christian König			alu_pop = 1;
25258813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
25268813842121d46d1be476807c98b0ba0b771f0c91Christian König	alu_pop += pops;
25278813842121d46d1be476807c98b0ba0b771f0c91Christian König	if (alu_pop == 1) {
25288813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER) << 3;
25298813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
25308813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else if (alu_pop == 2) {
25318813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->inst = CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER) << 3;
25328813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->force_add_cf = 1;
25338813842121d46d1be476807c98b0ba0b771f0c91Christian König	} else {
25348813842121d46d1be476807c98b0ba0b771f0c91Christian König		r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
25358813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->pop_count = pops;
25368813842121d46d1be476807c98b0ba0b771f0c91Christian König		ctx->bc->cf_last->cf_addr = ctx->bc->cf_last->id + 2;
25378813842121d46d1be476807c98b0ba0b771f0c91Christian König	}
2538a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2539a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2540a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
254109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2542a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
254309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
254409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
254509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
254609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
254709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
254809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
254909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
255009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
255109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
255209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
255309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
255409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
255509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
255609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2557a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
255809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
255909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
256009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
256109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
256209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
256309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
256409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
256509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
256609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
256709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
256809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2569a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2570a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2571a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
257209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
257309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
257409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
257509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
257609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
257709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
257809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
25797ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
258009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
258109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
258209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
258309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
258409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
258509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
258609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
258709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
258809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
258909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
259009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
259109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
259209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
259309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
259409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
259509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
259609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
259709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
259809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
259909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
260009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
260109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
260309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
260409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
260509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
260609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
260709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
260809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2609a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
261009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
261109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2612a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
261309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
261409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
261509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
261609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
261709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
261809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
261909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
262009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
262109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
262209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
262309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
262409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
262509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
262609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
262709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
262809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
262909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
263009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
263109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
263209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
263309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
263409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
263509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
263609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
263709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
263809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
263909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2640a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
264109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
264209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
264309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
264409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2645a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
264609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
264709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
264809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
264909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
265009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
265109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
26537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
265509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
265809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
266809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2680a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
268109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2682a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
268509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2687a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2688a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2689a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2690a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2691a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2692a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2693a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2694a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2696a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2697a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2698a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2699a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2700a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2701a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2702a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2703a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2704a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2705a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2706a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2707a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2708a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2709a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2710a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2711a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2713a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
271509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
271609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
271709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
271809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
271909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
272009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
272109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2722a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
272309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
272409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2725a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
272609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
272709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
272809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
272909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
273009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
273109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
273209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
273309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
273409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2735a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
273609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
273709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
273809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
273909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
274009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
274109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
274209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
274309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
274409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
274509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
274609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
274709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
274809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
274909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
275009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
275109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
275209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
275309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
275409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
275509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
275609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
275709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
275809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
275909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
276009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
276109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
276209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
276309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
276409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
276509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
276609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
276709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
276809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
276909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
277009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
277109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
277209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
277309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
277409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
277509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
277609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
277709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
277809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
277909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
278009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
278109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2782a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
278698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
2787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
27880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
2789df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2790df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
2791df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2792df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
2793df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2794df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
2795df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
279642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
279736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2798460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
2799de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2801cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2802cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
280357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
2804dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2806d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2807be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
2809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2810b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
2811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28183af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
2819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28203af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
2821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
28234558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
2824a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
28250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
2826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2827de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28287a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
2829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2830e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
283188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
28323af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
28333af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
28344502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
2835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28400d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
2841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28420d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
284388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
2844d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
28450d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
2846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2847b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2849b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28569f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
2857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28600d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
286187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
286292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
2863d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
2864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2866cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2867ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
2869a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
2870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2873a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
2874a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
2875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2881de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28834558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
2884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2885de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2886de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2887de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2888de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2889de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2891de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2892de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2893de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
2895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
289709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
2898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
2900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2904de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2905de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2907de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2910de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2911de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2912de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2913de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2914de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2916094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
2917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
2918de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2919de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2920de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2921de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2922de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2923de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2924de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2925de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2926de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2927de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2928de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2929de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2930de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2931de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2932de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2933de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2934de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2935de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2936de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2937de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2941de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2945de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2946de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2947de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
294850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
294950526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
295098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
295150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
295250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
295350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
295450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
295550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
295650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
295750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
295850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
295950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
296050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
296150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
296250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
296350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
296450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
296550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
296650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
296750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
296850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
296950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
297150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
297450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
297750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
297950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
298150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
298250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
298350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
298450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
298550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
298750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
298950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
299050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
299150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
299250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
299350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
299950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
300150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
300250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
300350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
300450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
300650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
300850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
301550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
301950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
302050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
302150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
302250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3025ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
302650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
302750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
302850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
302950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
303250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
303350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
303450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
304250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
304450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
304950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
305350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
305650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
305850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
305950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
306050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
306650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
306950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
307550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
307650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
307750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
307950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
308950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
309950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
310550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3106