r600_shader.c revision 4afd0683854ac1cfbe7118232b5e344c83d4b0c2
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 */
471235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < 10; i++) {
481235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_vs_out_id[i] = 0;
491235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
501235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < 32; i++) {
511235becaa1cf7e29f580900592563c3329d326deJerome Glisse		tmp = i << ((i & 3) * 8);
521235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_vs_out_id[i / 4] |= tmp;
531235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
541235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < 10; i++) {
551235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate,
561235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R_028614_SPI_VS_OUT_ID_0 + i * 4,
571235becaa1cf7e29f580900592563c3329d326deJerome Glisse					spi_vs_out_id[i], 0xFFFFFFFF, NULL);
581235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
591235becaa1cf7e29f580900592563c3329d326deJerome Glisse
601235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
611235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_0286C4_SPI_VS_OUT_CONFIG,
621235becaa1cf7e29f580900592563c3329d326deJerome Glisse			S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2),
631235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0xFFFFFFFF, NULL);
641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
651235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_028868_SQ_PGM_RESOURCES_VS,
661235becaa1cf7e29f580900592563c3329d326deJerome Glisse			S_028868_NUM_GPRS(rshader->bc.ngpr) |
671235becaa1cf7e29f580900592563c3329d326deJerome Glisse			S_028868_STACK_SIZE(rshader->bc.nstack),
681235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0xFFFFFFFF, NULL);
691235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
701235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_0288A4_SQ_PGM_RESOURCES_FS,
711235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0x00000000, 0xFFFFFFFF, NULL);
721235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
731235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_0288D0_SQ_PGM_CF_OFFSET_VS,
741235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0x00000000, 0xFFFFFFFF, NULL);
751235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
761235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_0288DC_SQ_PGM_CF_OFFSET_FS,
771235becaa1cf7e29f580900592563c3329d326deJerome Glisse			0x00000000, 0xFFFFFFFF, NULL);
781235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
791235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_028858_SQ_PGM_START_VS,
80d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse			r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
811235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
821235becaa1cf7e29f580900592563c3329d326deJerome Glisse			R_028894_SQ_PGM_START_FS,
83f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bo_offset(shader->bo_fetch) >> 8, 0xFFFFFFFF, shader->bo_fetch);
84738aa29289296512959cbb37d8602131dae44dabDave Airlie
85738aa29289296512959cbb37d8602131dae44dabDave Airlie	r600_pipe_state_add_reg(rstate,
86738aa29289296512959cbb37d8602131dae44dabDave Airlie				R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF,
87738aa29289296512959cbb37d8602131dae44dabDave Airlie				0xFFFFFFFF, NULL);
88738aa29289296512959cbb37d8602131dae44dabDave Airlie
891235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
901235becaa1cf7e29f580900592563c3329d326deJerome Glisse
91dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_find_vs_semantic_index(struct r600_shader *vs,
921235becaa1cf7e29f580900592563c3329d326deJerome Glisse				struct r600_shader *ps, int id)
931235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
941235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader_io *input = &ps->input[id];
951235becaa1cf7e29f580900592563c3329d326deJerome Glisse
961235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (int i = 0; i < vs->noutput; i++) {
971235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (input->name == vs->output[i].name &&
981235becaa1cf7e29f580900592563c3329d326deJerome Glisse			input->sid == vs->output[i].sid) {
991235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return i - 1;
1001235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1021235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
1031235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
1041235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1051235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)
1061235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
1071235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
1081235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_state *rstate = &shader->rstate;
1091235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
1101e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	unsigned i, tmp, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1;
1111e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	int pos_index = -1, face_index = -1;
1121235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* clear previous register */
1141235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rstate->nregs = 0;
1151235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1161235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->ninput; i++) {
117dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlie		tmp = S_028644_SEMANTIC(r600_find_vs_semantic_index(&rctx->vs_shader->shader, rshader, i));
1188a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		if (rshader->input[i].centroid)
1198a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie			tmp |= S_028644_SEL_CENTROID(1);
12068014c8d19559576d368e158932278df05fe659bDave Airlie		if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
12168014c8d19559576d368e158932278df05fe659bDave Airlie			tmp |= S_028644_SEL_LINEAR(1);
12268014c8d19559576d368e158932278df05fe659bDave Airlie
1231235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
1241e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie			pos_index = i;
1251235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR ||
1261235becaa1cf7e29f580900592563c3329d326deJerome Glisse		    rshader->input[i].name == TGSI_SEMANTIC_BCOLOR ||
1271235becaa1cf7e29f580900592563c3329d326deJerome Glisse		    rshader->input[i].name == TGSI_SEMANTIC_POSITION) {
1281235becaa1cf7e29f580900592563c3329d326deJerome Glisse			tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
1291235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1301235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
1311e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie			face_index = i;
1321235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC &&
1331235becaa1cf7e29f580900592563c3329d326deJerome Glisse			rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) {
1341235becaa1cf7e29f580900592563c3329d326deJerome Glisse			tmp |= S_028644_PT_SPRITE_TEX(1);
1351235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1361235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL);
1371235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1381235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->noutput; i++) {
13951f9cc4759c23b74a2e4d9c79b0a5df27d403f54Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
1407777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie			r600_pipe_state_add_reg(rstate,
1417777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						R_02880C_DB_SHADER_CONTROL,
1427777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						S_02880C_Z_EXPORT_ENABLE(1),
1437777c997e0f4cf75ff292f34a5a64ee2834c0f26Dave Airlie						S_02880C_Z_EXPORT_ENABLE(1), NULL);
14439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
14539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			r600_pipe_state_add_reg(rstate,
14639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						R_02880C_DB_SHADER_CONTROL,
14739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						S_02880C_STENCIL_REF_EXPORT_ENABLE(1),
14839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie						S_02880C_STENCIL_REF_EXPORT_ENABLE(1), NULL);
1491235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1501235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1511235becaa1cf7e29f580900592563c3329d326deJerome Glisse	exports_ps = 0;
1521235becaa1cf7e29f580900592563c3329d326deJerome Glisse	num_cout = 0;
1531235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rshader->noutput; i++) {
15439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
1551235becaa1cf7e29f580900592563c3329d326deJerome Glisse			exports_ps |= 1;
1561235becaa1cf7e29f580900592563c3329d326deJerome Glisse		else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) {
1571235becaa1cf7e29f580900592563c3329d326deJerome Glisse			num_cout++;
1581235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
1591235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1601235becaa1cf7e29f580900592563c3329d326deJerome Glisse	exports_ps |= S_028854_EXPORT_COLORS(num_cout);
1611235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (!exports_ps) {
1621235becaa1cf7e29f580900592563c3329d326deJerome Glisse		/* always at least export 1 component per pixel */
1631235becaa1cf7e29f580900592563c3329d326deJerome Glisse		exports_ps = 2;
1641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1651235becaa1cf7e29f580900592563c3329d326deJerome Glisse
1661235becaa1cf7e29f580900592563c3329d326deJerome Glisse	spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) |
1671235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_0286CC_PERSP_GRADIENT_ENA(1);
1681235becaa1cf7e29f580900592563c3329d326deJerome Glisse	spi_input_z = 0;
1691e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	if (pos_index != -1) {
1701e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie		spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) |
1711e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie					S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) |
1721e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie					S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) |
1731e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie					S_0286CC_BARYC_SAMPLE_CNTL(1));
1741235becaa1cf7e29f580900592563c3329d326deJerome Glisse		spi_input_z |= 1;
1751235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
1761e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie
1771e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	spi_ps_in_control_1 = 0;
1781e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	if (face_index != -1) {
1791e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie		spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) |
1800637044add50b3a4aee8e915b84c18813c9130f3Dave Airlie			S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr);
1811e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	}
1821e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie
1831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, 0xFFFFFFFF, NULL);
1841e82c28fcf76bf79ceb5a1eaf29b3d6d25909dddDave Airlie	r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1, 0xFFFFFFFF, NULL);
1851235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, 0xFFFFFFFF, NULL);
1861235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1871235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028840_SQ_PGM_START_PS,
188d22a1247d8a709cf433a6dd99b2f87a224c27d88Jerome Glisse				r600_bo_offset(shader->bo) >> 8, 0xFFFFFFFF, shader->bo);
1891235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1901235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028850_SQ_PGM_RESOURCES_PS,
1911235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_028868_NUM_GPRS(rshader->bc.ngpr) |
1921235becaa1cf7e29f580900592563c3329d326deJerome Glisse				S_028868_STACK_SIZE(rshader->bc.nstack),
1931235becaa1cf7e29f580900592563c3329d326deJerome Glisse				0xFFFFFFFF, NULL);
1941235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1951235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_028854_SQ_PGM_EXPORTS_PS,
1961235becaa1cf7e29f580900592563c3329d326deJerome Glisse				exports_ps, 0xFFFFFFFF, NULL);
1971235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_pipe_state_add_reg(rstate,
1981235becaa1cf7e29f580900592563c3329d326deJerome Glisse				R_0288CC_SQ_PGM_CF_OFFSET_PS,
1991235becaa1cf7e29f580900592563c3329d326deJerome Glisse				0x00000000, 0xFFFFFFFF, NULL);
2001235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2011235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (rshader->uses_kill) {
2021235becaa1cf7e29f580900592563c3329d326deJerome Glisse		/* only set some bits here, the other bits are set in the dsa state */
2031235becaa1cf7e29f580900592563c3329d326deJerome Glisse		r600_pipe_state_add_reg(rstate,
2041235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R_02880C_DB_SHADER_CONTROL,
2051235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1),
2061235becaa1cf7e29f580900592563c3329d326deJerome Glisse					S_02880C_KILL_ENABLE(1), NULL);
2071235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
208738aa29289296512959cbb37d8602131dae44dabDave Airlie	r600_pipe_state_add_reg(rstate,
209738aa29289296512959cbb37d8602131dae44dabDave Airlie				R_03E200_SQ_LOOP_CONST_0, 0x01000FFF,
210738aa29289296512959cbb37d8602131dae44dabDave Airlie				0xFFFFFFFF, NULL);
2111235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2121235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2131235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader)
2141235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
2151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2161235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *rshader = &shader->shader;
2171235becaa1cf7e29f580900592563c3329d326deJerome Glisse	void *ptr;
2181235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2191235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* copy new shader */
220f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	if (rshader->processor_type == TGSI_PROCESSOR_VERTEX && shader->bo_fetch == NULL) {
221f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		shader->bo_fetch = r600_bo(rctx->radeon, rshader->bc_fetch.ndw * 4, 4096, 0, 0);
222f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		if (shader->bo_fetch == NULL) {
223f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			return -ENOMEM;
224f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
225f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		ptr = r600_bo_map(rctx->radeon, shader->bo_fetch, 0, NULL);
226f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		memcpy(ptr, rshader->bc_fetch.bytecode, rshader->bc_fetch.ndw * 4);
227f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo_fetch);
228f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	}
2291235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->bo == NULL) {
23029c4a15bf61a76cd71ffa5b8f09706d0eab84281Keith Whitwell		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0);
2311235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (shader->bo == NULL) {
2321235becaa1cf7e29f580900592563c3329d326deJerome Glisse			return -ENOMEM;
2331235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
234294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		ptr = r600_bo_map(rctx->radeon, shader->bo, 0, NULL);
2351235becaa1cf7e29f580900592563c3329d326deJerome Glisse		memcpy(ptr, rshader->bc.bytecode, rshader->bc.ndw * 4);
236294c9fce1b924beddf198a3cce738b88eabb5537Jerome Glisse		r600_bo_unmap(rctx->radeon, shader->bo);
2371235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2381235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* build state */
2391235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rshader->flat_shade = rctx->flatshade;
2401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	switch (rshader->processor_type) {
2411235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_VERTEX:
2421235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2431235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_vs(ctx, shader);
2441235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2451235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_vs(ctx, shader);
2461235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2471235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2481235becaa1cf7e29f580900592563c3329d326deJerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
2491235becaa1cf7e29f580900592563c3329d326deJerome Glisse		if (rshader->family >= CHIP_CEDAR) {
2501235becaa1cf7e29f580900592563c3329d326deJerome Glisse			evergreen_pipe_shader_ps(ctx, shader);
2511235becaa1cf7e29f580900592563c3329d326deJerome Glisse		} else {
2521235becaa1cf7e29f580900592563c3329d326deJerome Glisse			r600_pipe_shader_ps(ctx, shader);
2531235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
2541235becaa1cf7e29f580900592563c3329d326deJerome Glisse		break;
2551235becaa1cf7e29f580900592563c3329d326deJerome Glisse	default:
2561235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
2571235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2581235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r600_context_pipe_state_set(&rctx->ctx, &shader->rstate);
2591235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
2601235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
2611235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2621235becaa1cf7e29f580900592563c3329d326deJerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *rshader)
2631235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
2641235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
2651235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_shader *shader = &rshader->shader;
2661235becaa1cf7e29f580900592563c3329d326deJerome Glisse	const struct util_format_description *desc;
2671235becaa1cf7e29f580900592563c3329d326deJerome Glisse	enum pipe_format resource_format[160];
2681235becaa1cf7e29f580900592563c3329d326deJerome Glisse	unsigned i, nresources = 0;
269f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	struct r600_bc *bc = &shader->bc_fetch;
2701235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc_cf *cf;
2711235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_bc_vtx *vtx;
2721235becaa1cf7e29f580900592563c3329d326deJerome Glisse
2731235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
2741235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return 0;
2756dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	/* doing a full memcmp fell over the refcount */
2766dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	if ((rshader->vertex_elements.count == rctx->vertex_elements->count) &&
2776dc051557d99e81fc58e09edf21f185874dc1979Dave Airlie	    (!memcmp(&rshader->vertex_elements.elements, &rctx->vertex_elements->elements, 32 * sizeof(struct pipe_vertex_element)))) {
2781235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return 0;
2791235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
2801235becaa1cf7e29f580900592563c3329d326deJerome Glisse	rshader->vertex_elements = *rctx->vertex_elements;
2811235becaa1cf7e29f580900592563c3329d326deJerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
282e68c83a5a01a8a659857310cfcc785c7e028d3f0Dave Airlie		resource_format[nresources++] = rctx->vertex_elements->hw_format[i];
2831235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
284f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	r600_bo_reference(rctx->radeon, &rshader->bo_fetch, NULL);
2851235becaa1cf7e29f580900592563c3329d326deJerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
2861235becaa1cf7e29f580900592563c3329d326deJerome Glisse		switch (cf->inst) {
2871235becaa1cf7e29f580900592563c3329d326deJerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
2881235becaa1cf7e29f580900592563c3329d326deJerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
2891235becaa1cf7e29f580900592563c3329d326deJerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
2901235becaa1cf7e29f580900592563c3329d326deJerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
2911235becaa1cf7e29f580900592563c3329d326deJerome Glisse				if (desc == NULL) {
2921235becaa1cf7e29f580900592563c3329d326deJerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
2931235becaa1cf7e29f580900592563c3329d326deJerome Glisse					return -EINVAL;
2941235becaa1cf7e29f580900592563c3329d326deJerome Glisse				}
2951235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
2961235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
2971235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
2981235becaa1cf7e29f580900592563c3329d326deJerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
2991235becaa1cf7e29f580900592563c3329d326deJerome Glisse			}
3001235becaa1cf7e29f580900592563c3329d326deJerome Glisse			break;
3011235becaa1cf7e29f580900592563c3329d326deJerome Glisse		default:
3021235becaa1cf7e29f580900592563c3329d326deJerome Glisse			break;
3031235becaa1cf7e29f580900592563c3329d326deJerome Glisse		}
3041235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
305f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	return r600_bc_build(&shader->bc_fetch);
3061235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
3071235becaa1cf7e29f580900592563c3329d326deJerome Glisse
308dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_pipe_shader *shader)
3091235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
3101235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
3111235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
3121235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3131235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (shader == NULL)
3141235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
3151235becaa1cf7e29f580900592563c3329d326deJerome Glisse	/* there should be enough input */
3161235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (rctx->vertex_elements->count < shader->shader.bc.nresource) {
3171235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
3181235becaa1cf7e29f580900592563c3329d326deJerome Glisse			rctx->vertex_elements->count, shader->shader.bc.nresource);
3191235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return -EINVAL;
3201235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
3211235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_shader_update(ctx, shader);
3221235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r)
3231235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3241235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return r600_pipe_shader(ctx, shader);
3251235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
3261235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3271235becaa1cf7e29f580900592563c3329d326deJerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
328dbcd6526021c50770c3e5e04b04dc64c70298124Dave Airlieint r600_pipe_shader_create(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens)
3291235becaa1cf7e29f580900592563c3329d326deJerome Glisse{
3301235becaa1cf7e29f580900592563c3329d326deJerome Glisse	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
3311235becaa1cf7e29f580900592563c3329d326deJerome Glisse	int r;
3321235becaa1cf7e29f580900592563c3329d326deJerome Glisse
3331235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
3341235becaa1cf7e29f580900592563c3329d326deJerome Glisse//tgsi_dump(tokens, 0);
3351235becaa1cf7e29f580900592563c3329d326deJerome Glisse	shader->shader.family = r600_get_family(rctx->radeon);
3361235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_shader_from_tgsi(tokens, &shader->shader);
3371235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
3381235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("translation from TGSI failed !\n");
3391235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3401235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
3411235becaa1cf7e29f580900592563c3329d326deJerome Glisse	r = r600_bc_build(&shader->shader.bc);
3421235becaa1cf7e29f580900592563c3329d326deJerome Glisse	if (r) {
3431235becaa1cf7e29f580900592563c3329d326deJerome Glisse		R600_ERR("building bytecode failed !\n");
3441235becaa1cf7e29f580900592563c3329d326deJerome Glisse		return r;
3451235becaa1cf7e29f580900592563c3329d326deJerome Glisse	}
346f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	if (shader->shader.processor_type == TGSI_PROCESSOR_VERTEX) {
347f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		r = r600_bc_build(&shader->shader.bc_fetch);
348f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		if (r) {
349f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			R600_ERR("building bytecode failed !\n");
350f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			return r;
351f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
352f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	}
3531235becaa1cf7e29f580900592563c3329d326deJerome Glisse//fprintf(stderr, "______________________________________________________________\n");
3541235becaa1cf7e29f580900592563c3329d326deJerome Glisse	return 0;
3551235becaa1cf7e29f580900592563c3329d326deJerome Glisse}
3561235becaa1cf7e29f580900592563c3329d326deJerome Glisse
357ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeckvoid
358ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeckr600_pipe_shader_destroy(struct pipe_context *ctx, struct r600_pipe_shader *shader)
359ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck{
360ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
361ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
362ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	r600_bo_reference(rctx->radeon, &shader->bo, NULL);
363ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
364f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck	r600_bc_clear(&shader->shader.bc);
365f4a2c62af56ce10e43688e8283f8defeb05cef1aTilman Sauerbeck
366ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck	/* FIXME: is there more stuff to free? */
367ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck}
368ccb9be105602edaaff196046e324c8cb4a12fe0aTilman Sauerbeck
3691235becaa1cf7e29f580900592563c3329d326deJerome Glisse/*
3701235becaa1cf7e29f580900592563c3329d326deJerome Glisse * tgsi -> r600 shader
3711235becaa1cf7e29f580900592563c3329d326deJerome Glisse */
3722b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
3732b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3742b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
3752b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
3762b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
3772b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
3782b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
3792b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
3802b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
3812b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
3822b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
383f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	struct r600_bc				*bc_fetch;
3842b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
3852b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
386cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
387cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
388e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
389fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* needed for evergreen interpolation */
390fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_centroid;
391fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_linear;
392fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean                                 input_perspective;
393fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int					num_interp_gpr;
3942b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
3952b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
3962b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
3972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
3992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
4002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
4012b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
4022b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
40350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[];
40442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
41472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
418c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
419a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
42372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
424a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
4268260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell		if (i->Src[j].Register.Dimension) {
4278260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell			R600_ERR("unsupported src %d (dimension %d)\n", j,
4288260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell				 i->Src[j].Register.Dimension);
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
43347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
43447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
43972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
44072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
441fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int input)
44250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
44350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
44450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
445fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int gpr = 0, base_chan = 0;
446fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ij_index = 0;
447fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
448fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
449fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
450fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
451fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
452fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	} else if (ctx->shader->input[input].interpolate == TGSI_INTERPOLATE_LINEAR) {
453fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ij_index = 0;
454fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* if we have perspective add one */
455fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->input_perspective)  {
456fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
457fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			/* if we have perspective centroid */
458fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->input_centroid)
459fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				ij_index++;
460fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
461fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->shader->input[input].centroid)
462fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ij_index++;
463fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
4647ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
465fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* work out gpr and base_chan from index */
466fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	gpr = ij_index / 2;
467fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	base_chan = (2 * (ij_index % 2)) + 1;
46850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
46950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
47050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
47150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
47250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
47350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
47450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
47550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
47650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
47750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
478fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			alu.dst.sel = ctx->shader->input[input].gpr;
47950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
48050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
48150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
48250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
483fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
484fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].sel = gpr;
485fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[0].chan = (base_chan - (i % 2));
486fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
487fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + ctx->shader->input[input].lds_pos;
48850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
48950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
49050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
49150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
49250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
49350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
49450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
49550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
49650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
4977ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse}
4987ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
4997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
500de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
50172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
50672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
51235e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
5138a9f02c5d503089bdcc90ff934f6269e59356d52Dave Airlie		ctx->shader->input[i].centroid = d->Declaration.Centroid;
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
530e973221538d5edfad62abedf5b37a4fb774d71fcDave Airlie			vtx.use_const_fields = 1;
531f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r = r600_bc_add_vtx(ctx->bc_fetch, &vtx);
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
5354afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == CHIPREV_EVERGREEN) {
53650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
537fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION) {
538fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				if (ctx->shader->input[i].interpolate > 0) {
539fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					ctx->shader->input[i].lds_pos = ctx->shader->nlds++;
540fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie					evergreen_interp_alu(ctx, i);
541fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				}
542fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			}
54350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
55035e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
55433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
55547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
56272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
56372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
564be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
565be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
566be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
567be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
568be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
5697ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
570fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * for evergreen we need to scan the shader to find the number of GPRs we need to
571fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * reserve for interpolation.
572fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie *
573fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * we need to know if we are going to emit
574fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * any centroid inputs
575fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie * if perspective and linear are required
576fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie*/
577fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airliestatic int evergreen_gpr_count(struct r600_shader_ctx *ctx)
578fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie{
579fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int i;
580fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int num_baryc;
581fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
582fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_linear = FALSE;
583fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_perspective = FALSE;
584fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->input_centroid = FALSE;
585fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr = 1;
586fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
587fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* any centroid inputs */
588fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	for (i = 0; i < ctx->info.num_inputs; i++) {
589fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* skip position/face */
590fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION ||
591fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE)
592fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			continue;
593fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR)
594fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_linear = TRUE;
595fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_PERSPECTIVE)
596fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_perspective = TRUE;
597fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (ctx->info.input_centroid[i])
598fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			ctx->input_centroid = TRUE;
599fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
600fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
601fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	num_baryc = 0;
602fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* ignoring sample for now */
603fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_perspective)
604fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
605fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_linear)
606fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc++;
607fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ctx->input_centroid)
608fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		num_baryc *= 2;
609fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
610fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	ctx->num_interp_gpr += (num_baryc + 1) >> 1;
611fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
612fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	/* TODO PULL MODEL and LINE STIPPLE, FIXED PT POS */
613fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	return ctx->num_interp_gpr;
614fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie}
615fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
61772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
620c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
621457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
62472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
626f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc_fetch = &shader->bc_fetch;
627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
636f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	if (shader->processor_type == TGSI_PROCESSOR_VERTEX) {
637f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		r = r600_bc_init(ctx.bc_fetch, shader->family);
638f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		if (r)
639f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			return r;
640f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		ctx.bc_fetch->type = -1;
641f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	}
642f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	ctx.bc->type = shader->processor_type;
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
645076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
646076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
647076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
648076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
650076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
651076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
652076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
653076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
6684afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx.bc->chiprev == CHIPREV_EVERGREEN) {
669f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
670f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
671f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc, V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS);
672f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
6744afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && ctx.bc->chiprev == CHIPREV_EVERGREEN) {
675fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ctx.file_offset[TGSI_FILE_INPUT] = evergreen_gpr_count(&ctx);
67684457701b05ef29126d90c2fe72083278d26bd4fAndre Maasikas	}
677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
681d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie
682d2c06b5037fe9282cbbc0c7acd84a1b286716507Dave Airlie	ctx.file_offset[TGSI_FILE_CONSTANT] = 128;
683d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
688cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
689cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
690cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen
691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
696cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
697cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
698cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
699cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
700cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
701cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
702cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
703cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
704cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
705cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
716be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
717be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
718be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
7204afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher			if (ctx.bc->chiprev == CHIPREV_EVERGREEN)
72150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
72250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
72350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
7272b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
738457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
739457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
740c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
741c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
742c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
743c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
744c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
745c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
746c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
747c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
748c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
749c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
750a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
751457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
754c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
755c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
757457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
758457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
759457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
760457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
761457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
762457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
763457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
768b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
769c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
7705f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
771c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
772b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
77339d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 7;
77439d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
77539d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
77639d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_STENCIL) {
77739d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].array_base = 61;
77839d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_x = 7;
77939d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_y = 1;
78039d1feb51e9dac794751e72f48faf26409a84b1cDave Airlie				output[i].swizzle_z = output[i].swizzle_w = 7;
781c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
79272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
793457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
794457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
795457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
796457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
797457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
798457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
799457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
800457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
801457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
802457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
803457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
804457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
805457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
806457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
807457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
808457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
809457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
810457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
811457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
812457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
8137e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
814457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
816c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
817481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
818481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
819481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
820481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
821481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
822481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
823481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
824481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
825481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
826481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
827608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
828481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
829a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
830481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
831481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
832457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
833457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
834457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
835457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
836457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
837b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
838b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
839a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
840c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
841c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
842f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	/* add return to fetch shader */
843f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
8444afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher		if (ctx.bc->chiprev == CHIPREV_EVERGREEN) {
845f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc_fetch, EG_V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
846f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		} else {
847f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse			r600_bc_add_cfinst(ctx.bc_fetch, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
848f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse		}
849f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse	}
850457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
851457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
852c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
856cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
860cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
880cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	int index;
8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
882de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
883de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
884de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
885cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
886cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[0] = ctx->literals[index * 4 + 0];
887cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[1] = ctx->literals[index * 4 + 1];
888cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[2] = ctx->literals[index * 4 + 2];
889cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[3] = ctx->literals[index * 4 + 3];
890de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
89147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_src->Register.Indirect)
89247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_src->rel = V_SQ_REL_RELATIVE;
8931bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
8948260ab93461eca3e18f9c17a9ca1961a11372071Keith Whitwell	r600_src->abs = tgsi_src->Register.Absolute;
895de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
896de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
897de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
898de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
899de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
900de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
901de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
902de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
903de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
9047a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9057a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
906de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
907de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
908de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
909de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
91047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
91147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
9127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
9137a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
9147a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
915de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
916de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
917de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
9247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
9257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
9267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
9277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
9287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
9297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
9307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
9317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
9327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
9337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
9347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
9357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
9367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
9387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
9397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
9407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
9417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
9427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
9437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
9447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
9457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
9467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
9477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
9487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
9497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
9509d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
951be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
9527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
9537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
954a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
9559d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
9567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
95740cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid				alu.src[0].rel = r600_src[i].rel;
958be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
9597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
9607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
9617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
9627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
9637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
9647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
9657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
9667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
9679d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
96840cc5bfcd70e412289dbb32a1ebca91bf109e1bdStephan Schmid			r600_src[i].rel =0;
9697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
9707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
9717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
9727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
9737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
9747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
975be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
976be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
977be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
978be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
979be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
98020846a8ce102aa2bc6d3f1e907d490940c0d0a69Vinson Lee	int i, j, k, nliteral, r;
981be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
982be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
983be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
984be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
985be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
986be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
9879d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	for (i = 0, j = nliteral - 1; i < inst->Instruction.NumSrcRegs; i++) {
9889d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		if (j > 0 && inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
989be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
990be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
991be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
992a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
9939d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse				alu.src[0].sel = r600_src[i].sel;
994be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
995be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
996be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
997be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
998be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
999be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
1000be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
1001be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
1002be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
1003be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
10049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r = r600_bc_add_literal(ctx->bc, &ctx->literals[inst->Src[i].Register.Index * 4]);
1005be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			if (r)
1006be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				return r;
10079d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			r600_src[i].sel = treg;
10089d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse			j--;
1009be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
1010be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
1011be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
1012be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
1013be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1014d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
1015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1018de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1019de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1020d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	int lasti = 0;
1021d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1022d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
1023d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
1024d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
1025d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
1026d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
1027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
10287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
10297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
10307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
10319d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
10329d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
10339d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1034d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1035d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1036d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
1037d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1038de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1039d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1040d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
1041d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
10427ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1043d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
1044d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
1045de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
10467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
10477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1048de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
1049d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
1050d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
1051d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
1052d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1053d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
1054d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1055de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1056de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
1057de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1058de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
1059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
1060de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
10617a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
10627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
10637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
1064de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
1065de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
1066de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1067d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
1068de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1069de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1070de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1071de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1072de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
1075de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1076de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1077d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
1078d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1079d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
1080d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1081d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
1082d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
1083d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
1084d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
1085d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
1086d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
10877ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse/*
108888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
108988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
109088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
109188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
109292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
109392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie			   struct r600_bc_alu_src r600_src[3])
109488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
109588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
109692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
109788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
109892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
10997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
110088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
110188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
110288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
110388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
11049d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
11059d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
11069d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1107be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1108be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1109be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	if (r)
1110be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		return r;
1111be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
111288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
111388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
111488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1116a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
111788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
111888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
111988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
112088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
112188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
112288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
112388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
112488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
11257ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1126921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
112788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1128921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
112988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
113088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
113188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
113288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
113388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
113488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
113588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
113688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
113788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
113888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1139a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
11407ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
114188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
114288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
114388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
114488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
114588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
114688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
114788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
114888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
114988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
115088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
115188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
11524afd0683854ac1cfbe7118232b5e344c83d4b0c2Alex Deucher	if (ctx->bc->chiprev == CHIPREV_R600) {
115388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
115488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
115588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
115688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
115788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
115888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
115988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
116088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
1161a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
116288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
116388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
116488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
116588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
116688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
116788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
116888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
116988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
11707ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1171921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
117288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
1173921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
117488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
117588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
117688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
117788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
117888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
117988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
118088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
118188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
118292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
118392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
118492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
118592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
118692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
118792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
118892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
118992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
119092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
1191be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	int lasti = 0;
119292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
119392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
119492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
119592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
119688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
119788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
119888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
119988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
120088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
120188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
120288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
120388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
120488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
120588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
120688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
120788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
120888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
120988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
121088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
121188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
1212be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i))
1213be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			lasti = i;
1214be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
1215be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
1216be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
1217be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
1218be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
121988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1220a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1221be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
1222be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
122388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
122488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
122588f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
1226be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
122788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
122888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
122988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
123088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
123188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
123288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
123388f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
123488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
123592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
123692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
123792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
123892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
123992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
124092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
124192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
124257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
124357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
124457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
124557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
124657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_setup_trig(ctx, r600_src);
124757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
124857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
124957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
125092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
125192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
125257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
125357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
125457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
125557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
125657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
125757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
125892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
125957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
126057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
126157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
126257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
126357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
126457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
126557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
126692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
126792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
126857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
126957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
127057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
127157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
127257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
127357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
127457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
127557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
127657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
127757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
127857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
127957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
128057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
128157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
128292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1283ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
1284ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
1285ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1286ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1287ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1288ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1289ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
1290ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1291ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1292ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1293ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
1294ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1295ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1296ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1297ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1298ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1299ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1300ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1301ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1302ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1303ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1304ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1305ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1306ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1307ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1308ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1309ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1310ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1311ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1312ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1313ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1314ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1315ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1316ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1317ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1318ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1319ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1320ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1321ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1322ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1323ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1324ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1325ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1326ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1327ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1328ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1329ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1330ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
133192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
133292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
133392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1334094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1335094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1336094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1337094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1338094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1339094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1340094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1341094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1342094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
13434502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1344094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
13454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1346921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
13474502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
13484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
13494502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
13504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
13514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
13524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
13534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
13544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
13554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
13564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1357094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1358094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1359094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1360094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1361094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1362094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1363094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
13644502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
13654502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	if (r)
13664502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		return r;
13674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
13684502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
13694502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
13704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1371094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1372094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1373094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
13740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
13750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
13760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
1378ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	struct r600_bc_alu_src r600_src[3];
13790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
13800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1381ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
1382ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
1383ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
1384d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1385d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
1386d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
1387ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
13887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
13897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1390a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1391921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
13927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
13937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
13947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
13967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
13977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
13987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
14000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
14027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1403a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1404ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	alu.src[0] = r600_src[0];
1405921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
140685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
14077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
14087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
14097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
14107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
14117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
14127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
14137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
14140bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
14167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1417a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1418921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
14197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
14207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
14217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
14227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
14237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
14247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
14257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
14267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
14277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
14280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
14305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
14315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
14325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
14330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
14340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
14356a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
14366a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
14376a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
14380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
14390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1440a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1441ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
1442ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
14430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
14440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
14470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
14480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14515ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
14525ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
14535ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
145485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie
14556a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
14566a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
14570bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
14590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1460a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1461ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
14627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
14630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
14640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1465ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1466ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[2] = r600_src[0];
14677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
14680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
14690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
14700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
14710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
14720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
14730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
14740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
14775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
14785ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
14795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
14800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
14810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1482a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
14830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
14840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
14850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
14860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
14890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
14900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
14910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
14920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
14930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
14940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
14950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
149642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
149742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
149842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
149942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
150042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
150142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
150242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1503df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1504df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1505df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1506df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1507df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1508df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1509df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
151042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
151142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
151242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		if (r)
151342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck			return r;
151442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
151542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
151642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
151742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
151842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
151942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
152042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
152142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
152242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
152342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_literal(ctx->bc, ctx->value);
152442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
152542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
152642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
152742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
152842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
152942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
1530a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
15317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
15327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1534a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
15357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
15367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
15377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
15387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1539a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
15407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
15417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
15427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
15437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
15447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
15457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
15467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
15477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
15487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
15497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
15507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
15517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
15527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
15537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1554a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1555a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1556a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1557a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1558a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1559a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1560a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1561a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1562a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1563a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1564a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1565a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1566a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1567a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1568a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1569a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1570a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1571a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1572a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1573a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
15745ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
15755ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
15765ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
1577a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1578a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1579a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1580a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1581a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1582a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1583a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1584a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1585a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1586a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1587a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1588a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1589a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1590a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1591a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1592a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1593a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1594a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1595a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1596a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1597a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1598a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1599a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1600e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1601e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1602e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1603a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1604a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1605a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE);
1606a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1607a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1608a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1609a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1610a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1611a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1612a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1613a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1614a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1615a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1616a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1617e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1618e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1619e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1620a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1621a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1622a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1623a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1624a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1625a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1626a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1627a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1628a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1629a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1630e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1631e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1632e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1633a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1634a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1635a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
16360d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
16370d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
16380d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16390d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
16400d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1641921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
16420d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16430d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
16440d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
16450d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
16469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
16479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
16489d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
16490d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16500d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
16510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16520d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1653a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16540d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1655cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
16560d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1657cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
16580d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16590d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
16600d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
16610d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1662921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16630d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16640d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
16650d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
16660d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16670d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16680d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16690d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16700d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16710d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
1672cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
1673cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	if (r)
1674cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		return r;
16750d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16760d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
16770d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
16780d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1679a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
16800d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
16810d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16820d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16830d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
16840d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16850d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1686cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
16870d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
16880d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1689921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
16900d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
16910d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16920d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1693cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
16940d48925a56ad4fb253386110b545abda82a25464Dave Airlie
16950d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
16960d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
16970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16980d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
16990d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
17000d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
17010d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
17020d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
17030d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1704cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1705cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1706cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1707cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1708cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
17099961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
17109961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
17119961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1712cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1713cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1714cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1715a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
17166c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1717cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1718a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1719cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1720cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1721cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1722cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1723cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1724cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1725cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1726cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1727cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1728cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1729cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1730cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1731cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1732cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1733cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1734cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
17427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
17437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
17447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
17459d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
17469d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
17479d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
17547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1758cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1767cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1768cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1769cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1770cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1771cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1772cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1774cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1775cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1776cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
17777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
17787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
17797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
17809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
17819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
17829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
1783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1785cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1786cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
17877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
17887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1789cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1790cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1791cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1792cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1793cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1794cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1795cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1796cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1797921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1798cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1799cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1800cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1801cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1802cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1803921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1804cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1805cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1806cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1807e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1808e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1809e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1810e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1811e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1812e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1813e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1814cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1815cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1816de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1824cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
182733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
182833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
182933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
183033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1831641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1832641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1833b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1834bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1835bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY;
1836bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	uint32_t lit_vals[4];
1837641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1838641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1839641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1840b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1841b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1842b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1843a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1844bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1845bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1846bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1847bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1848b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1849b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1850b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1851b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1852b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1853b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1854b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1855b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
18569d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
1857b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1858b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1859a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1860b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1861b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1862bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1863bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1864bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1865b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1866b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1867b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1868b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1869b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1870b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1871b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1872b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1873b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1874a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1875921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1876b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1877b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1878b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1879b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1880b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1881b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1882b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1883b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
188407b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1885b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1886bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1887bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1888bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1889bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1890bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1891bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1892bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1893bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1894a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1895bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1896bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1897bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1898bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1899bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1900bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1901bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1902bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1903bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1904bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1905bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1906bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1907bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1908bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1909bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1910bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1911bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
191284b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee			default:
191384b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				assert(0);
191484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src_chan = 0;
191584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src2_chan = 0;
191684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				break;
1917bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1918bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1919bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1920bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1921bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan);
1922bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1923bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1924bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1925bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan);
1926bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1927bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1928bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1929bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1930bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1931bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1932bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1933bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1934bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1935bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1936bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1937bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1938a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1939bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1940bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1941bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1942bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1943bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1944bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1945bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1946bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1947bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1948bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
19497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1950bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1951bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
19527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		 * muladd has no writemask, have to use another temp
1953bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1954bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1955a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1956bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1957bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1958bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1959bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1960bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1961bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
19627ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1963bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1964bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1965bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1966bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1967bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1968bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1969bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1970bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1971bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1972bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1973bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1974bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1975a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1976bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1977bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1978bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1979bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1980bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1981bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
19827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
1983bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1984bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1985bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1986bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1987bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1988bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1989bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1990bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1991bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1992bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1993bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1994bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1995bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		lit_vals[0] = fui(1.5f);
1996bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1997bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_literal(ctx->bc, lit_vals);
1998bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1999bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
200007b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
2001bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
2002bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2003bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2004bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
2005b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
2006b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
2007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2008b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
2009a21a2748beb1f42d21e14858eee9a1323d85a00fFredrik Höglund			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
2010b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
2011b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
2012b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
2013b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
2014b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
2015b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
2016b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
2017b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
2018b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
2019b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
2020b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
20217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2022bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
2023bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
2024bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
2025bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
202633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
202733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
2028bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
2029ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.sampler_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
2030ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	tex.resource_id = tex.sampler_id;
2031ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie	if (ctx->shader->processor_type == TGSI_PROCESSOR_VERTEX)
2032ea1d818b58d6ff9e4cd0c40eb865beabde8f268cDave Airlie		tex.resource_id += PIPE_MAX_ATTRIBS;
2033641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
20346c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
20359d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_x = (inst->Dst[0].Register.WriteMask & 1) ? 0 : 7;
20369d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_y = (inst->Dst[0].Register.WriteMask & 2) ? 1 : 7;
20379d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_z = (inst->Dst[0].Register.WriteMask & 4) ? 2 : 7;
20389d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	tex.dst_sel_w = (inst->Dst[0].Register.WriteMask & 8) ? 3 : 7;
203933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
204033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
204133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
204233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
20439a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
2044bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
2045bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
2046bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
2047bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
2048bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
2049bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
2050bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
205101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
205201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
205301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
20547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
205501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
205601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
2057bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2058bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
20595d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
2060bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2061bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
2062bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
2063bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
2064bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
2065bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
2066bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
206733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
206833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
2069b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
2070b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
2071b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
20727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
2073b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
2074b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
2075b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
2076b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
20777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
20787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
20797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
20809d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
20819d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
20829d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
2083b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
2084b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
2085b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2086a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
2087921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
2088b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
20897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
20907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
2091b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
2092b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2093b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2094b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
2095b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2096b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2097b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2098b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2099b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2100b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2101b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2102b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
2103b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
2104b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
2105b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2106b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
2107b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
2108b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2109a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
2110b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
2111b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
21127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
21137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
2114b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2115b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2116b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
2117b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2118b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2119b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
2120b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2121b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2122b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2123b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
2125b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
2126b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
2127b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
2128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
2129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
2130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
2131a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
2132b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
21337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
21347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
21357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
21367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
2137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
2138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
2139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
2140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
2141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
2142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
2143b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
2144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
2145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
2146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
2147b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
2148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
2149b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
2150b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
215187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
215287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
215387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
215487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
215587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
215687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
215787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
215887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
215987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
216087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
216187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
21629d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
21639d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
21649d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
216587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
216687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
216787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
216887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
216987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
217087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2171a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
217287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
217387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
217487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
217587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
217687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
217787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
217887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
217987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
218087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
218187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
218287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
218387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
218487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
218587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
218687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
218787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
218887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
218987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
219087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
219187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
219287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
219387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
219487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
219587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
21967ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
219787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
219887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
219987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
220087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
220187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
22020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
22030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
22040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
22050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
22060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
22070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
22080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
22090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
22110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
22120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
22140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
22150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
22169d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	r = tgsi_split_literal_constant(ctx, r600_src);
22179d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse	if (r)
22189d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse		return r;
22199d4ae914e28ac7857a32a88ba27aecc182f697c6Jerome Glisse
22200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
22210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2222a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
22230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
22250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
22260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
22270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
22280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
22300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
22310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
22330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
22340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
22360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
22370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
22380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
22410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
22420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
22430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
22440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
22460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
22470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
22490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
22500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
22520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
22530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
22540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
22570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
22580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
22590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
22610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
22620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
22630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
22640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
22651e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
22661e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
22671e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
22681e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
22690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
22700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
22720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2273a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
22740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
22760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
22770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
22780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
22790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
22810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
22820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
22840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
22850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
22870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
22880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
22890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
22900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
22910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
22920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
22930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
22940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
22950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
22970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
22980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
22990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
23000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
23010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
23020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
23030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
23040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
23050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
23060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
23080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
23090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
23100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
23110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
23120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
23130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
23140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
23150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
23160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
23170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
23180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
23190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
23200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
23210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
23220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
23230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
23240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
23250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
23261e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
23271e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
23281e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
23291e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
23300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
23310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
23320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
23330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
23340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
23350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
233636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
233736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
233836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
233989c26866f05dcf8fbb716e38d4780cebcae71653Vinson Lee	struct r600_bc_alu_src r600_src[3] = { { 0 } };
234036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
234109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
234236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
234336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
234436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
234536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
234636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2347a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
234836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
234936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
235036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
235136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
235236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
235336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
235436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
235536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
235636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
235736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
235836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
235936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
236036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
236136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
23625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23645ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
23655ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
2366a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
236736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
236836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
236936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
237036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
237136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
237236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
237336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
237436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
237536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
237636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
23775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
23785ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
23795ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
23805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
238136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
23827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
238336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
238436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
238536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
238636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2387a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
238836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
238936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
239036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
239136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
239236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
239336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
239436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
239536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
239636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
239736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
239836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
239936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
240036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
240136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
240236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
240336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
240436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
240536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
24065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
24075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
24085ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
240936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
241036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
241136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
241236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
241336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2414a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
241536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
241636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
241736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
241836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
241936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
242036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
242136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
242236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
242336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
242436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
242536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
242636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
242736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
242836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
24295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
24305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
24315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
243236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
243336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
243436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
243536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
243636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
243736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2438a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
243936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
244036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
244136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
244236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
244336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
244436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
244536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
244636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
244736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
244836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
24495ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
24505ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
24515ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
245236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
245336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
245436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
245587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2456460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2457460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2458460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2459460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2460460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2461460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2462460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2463460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2464460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2465460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2466460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2467460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2468460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2469460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2470460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2471460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2472460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2473460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2474460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2475460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2476460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2477460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2478460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2479460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2480460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2481460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2482460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2483460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2484460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2485460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2486460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2487460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2488460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2489460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2490460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2491460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2492460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2493460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2494460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2495460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2496460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2497460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2498460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2499460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2500460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2501460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2502460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
250396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2504460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2505460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2506460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
250796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
250896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
250996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
251096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
251196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
251396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
251596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
251696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
251796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
251896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
251996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
252096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
252196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
252296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
252496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
252596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
252696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
252896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
252996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
253096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
253196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
253296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
253396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
253496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
253596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
253696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
253796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
253896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
253996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
254096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
254196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
254296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
254396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
254496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
254596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
254696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
254796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
254896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
254996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
255096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
255196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
255296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
255396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
255496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
255596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
255696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
255796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
255896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
255996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
256096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
256196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
256296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
256396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
256496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
256596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
256696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
256796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
256896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
256996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
257096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
257196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
257296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
257396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
257496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
257596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
257696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
257796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
257896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
257996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
258096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
258196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
258296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
258396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
258496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
258596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
258696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
258796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
258896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
258996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
259096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
259196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
259296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
259396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
259496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
259596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2596460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2597460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2598460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2599460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2600460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2601460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2602460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2603460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2604460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2605460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2606460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2607460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2608460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2609460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2610460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2611460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2612460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2613460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2614460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2615460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2616460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2617460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2618460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2619460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2620460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2621460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2622460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2623460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2624460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2625460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2626460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2627460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2628460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2629460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2630460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2631460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2632460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2633460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2634460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2635460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2636460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2637460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2638460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2639460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2640460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2641460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2642460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2643460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2644460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2645460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2646460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2647460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2648460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2649460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2650460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2651460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2652460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2653460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2654460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2655460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2656460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2657460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2658460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2659460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2660460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
266198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_eg_arl(struct r600_shader_ctx *ctx)
266298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie{
266398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
266498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	struct r600_bc_alu alu;
266598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	int r;
266698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
266798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie
266852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	switch (inst->Instruction.Opcode) {
266952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARL:
267052c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT_FLOOR;
267152c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
267252c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	case TGSI_OPCODE_ARR:
267352c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLT_TO_INT;
267452c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		break;
267552c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	default:
267652c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		assert(0);
267752c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher		return -1;
267852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	}
267952c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher
268098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
268198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
268298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
268398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
268498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
268598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.chan = 0;
268698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.sel = ctx->temp_reg;
268798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.dst.write = 1;
268898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
268998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
269098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
269198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
269298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT;
269398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
269498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
269598b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
269698b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].sel = ctx->temp_reg;
269798b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.src[0].chan = 0;
269898b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	alu.last = 1;
269998b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
270098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	if (r)
270198b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie		return r;
270298b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	return 0;
270398b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie}
270498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airliestatic int tgsi_r600_arl(struct r600_shader_ctx *ctx)
270547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
270647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
270747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
270847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
270947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
271047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
271147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
27127ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	switch (inst->Instruction.Opcode) {
27137ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARL:
27147ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
27157ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
27167ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	case TGSI_OPCODE_ARR:
27177ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA;
27187ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		break;
27197ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	default:
27207ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		assert(0);
27217ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		return -1;
27227ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
27237ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
272447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
272547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
272647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
272747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
272847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
272947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
273047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
273147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2732a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
273347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
273447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2735c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
273647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
273747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
273847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
273957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
274057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
274157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
274257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
274357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
274457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
274557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
274657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
274757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2748a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
274957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
275057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
275157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
27527ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
27537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse		if (i == 0 || i == 3) {
275457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
275557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
275657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
275757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
275857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
275957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
276057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
276157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
276257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 2) {
276357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
276457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
276557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]);
276657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
276757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
276857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
276957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
277057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
277157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
277257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
277357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
277457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
277557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
277657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
277757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
277857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2779a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2780a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2781a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
278209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2783a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2784a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2785a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2786a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2787a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2788a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2789a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2790a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2791a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2792a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2793a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2794a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2795a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2796a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2797a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2798a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
27997ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
2800a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2801a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2802a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2803a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2804a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2805a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2808a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2809a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2810a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
2811a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = pops;
2812a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2813a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2814a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
281509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2816a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
281709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
281809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
281909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
282009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
282109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
282209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
282309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
282409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
282509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
282609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
282809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
282909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2831a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
283309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
283409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
283509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
283609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
283709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
283809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
283909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
284009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
284109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
284209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2843a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2844a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2845a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
284609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
284709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
284809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
284909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
285009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
285109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
285209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
28537ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse	}
285409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
285509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
285609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
285709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
285809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
285909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
286009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
286109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
286209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
286309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
286409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
286509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
286609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
286709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
286809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
286909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
287009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
287109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
287209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
287309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
287509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
287609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
287709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
287809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
287909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
288009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
288109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
288209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2883a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
288409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
288509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2886a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
288709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
288809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
288909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
289009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
289109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
289209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
289309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
289409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
289509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
289609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
289709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
289809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
289909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
290009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
290109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
290209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
290309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
290409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
290509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
290609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
290709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
290809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
290909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
291009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
291109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
291209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
291309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2914a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
291509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
291609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
291709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
291809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2919a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
292009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
292109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
292209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
292309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
292409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
292509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
292609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
29277ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
292809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
292909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
293009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
293109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
293209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
293309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
293409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
293509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
293609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
293709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
293809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
293909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
294009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
294109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
294209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
294409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
294509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
294709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
294809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
294909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
295009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
295109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
295309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2954a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
295509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2956a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
295709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
295809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
295909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
296009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2961a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2962a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2963a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2964a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2965a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2966a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2967a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2968a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
296909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2970a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2971a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2972a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2973a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2974a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2975a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2976a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2977a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2978a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2979a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2980a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2981a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2982a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2983a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2984a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2985a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
298609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2987a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
298809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
298909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
299009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
299109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
299209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
299309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
299409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
299509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2996a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
299709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
299809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2999a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
300009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
300109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
300209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
300309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
300409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
300509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
300609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
300709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
300809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
3009a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
301009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
301209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
301309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
301409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
301509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
301609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
301709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
301809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
301909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
302009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
302109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
302209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
302309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
302409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
302509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
302609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
302709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
302809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
302909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
303009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
303109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
303209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
303309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
303409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
303509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
303609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
303709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
303809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
303909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
304009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
304109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
304209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
304309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
304409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
304509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
304609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
304709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
304809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
304909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
305009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
305109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
305209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
305309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
305409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
305509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
3056a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
3057a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
3058a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
3059de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
306098b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3061de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
30620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
3063df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
3064df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
3065df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
3066df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
3067df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
3068df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
3069df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
307042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
307136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
3072460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
3073de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
3074de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3075cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3076cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
307757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
3078dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
3079de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
3080d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
3081be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
3082de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
3083de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
3084b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
3085de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3086de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3087de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3088de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3089de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3090de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3091de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30923af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
3093de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30943af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
3095de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
30967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
30974558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
3098a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
30990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
3100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31027a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
3103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3104e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
310588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
31063af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
31073af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
31084502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
3109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31140d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
3115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
311788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
3118d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
31190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
3120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3121b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3123b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
3124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3129de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31309f7ec103e26c67cb077fd7d94d2fb68562b86c40Keith Whitwell	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_r600_arl},
3131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3133de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31340d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
313587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
313692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
3137d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
3138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3140cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3141ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
314209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
3143a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
3144de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3147a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
3148a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
3149de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3150de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3151de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3152de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3153de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3154de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3155de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3156de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
31574558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
3158de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3159de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3160de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3161de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3162de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3163de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3164de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3166de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3167de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
316809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
3169de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3170de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
3172de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
317309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
3174de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3177de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3178de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3180de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3181de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3182de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3183de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3184de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3185de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3186de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3187de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3188de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3189de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3190094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
3191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
3192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
3193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
3221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
322250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
322350526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
322498b3f27439ba3a48286ed0d6a4467e5482b41fecDave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
322550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
322650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
322750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
322850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
322950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
323050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
323150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
323250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
323350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
323450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
323550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
323650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
323750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
323850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
323950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
324050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
324150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
324250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
324350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
324550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
324850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
324950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
325150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
325350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
325450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
325550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
325650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
325750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
325850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
325950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
326150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
326350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
326450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
326550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
326650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
326750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
326950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
327350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
327550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
327650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
327750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
327850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
327950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
328050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
328250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
328852c66120d8c55d29af6af60f75eb1dc54d9b8062Alex Deucher	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_eg_arl},
328950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
329350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
329450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
329550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
329650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
329850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
3299ef2702fb2003944998ab1578119fb44fe16d1c82Dave Airlie	{TGSI_OPCODE_TXL,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
330050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
330150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
330250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
330350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
330450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
330550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
330650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
330750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
330850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
330950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
331650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
331850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
331950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
332750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
332950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
333050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
333150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
333250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
333350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
333450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
333550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
333650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
333750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
333850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
333950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
334050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
334850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
334950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
335050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
335150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
335950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
336950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
337950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3380